Skip to content

Instantly share code, notes, and snippets.

@kalgon
Created February 20, 2024 13:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kalgon/6892f178e8dc6829b7b3388c70d0007a to your computer and use it in GitHub Desktop.
Save kalgon/6892f178e8dc6829b7b3388c70d0007a to your computer and use it in GitHub Desktop.
Canonicalizing and Hashing XML in Java
import org.apache.xml.security.Init;
import org.apache.xml.security.c14n.Canonicalizer;
import org.apache.xml.security.exceptions.XMLSecurityException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Base64;
public class XmlHash {
static {
Init.init();
}
public static void main(String... args) throws Exception {
hash("<hello>world</hello>");
hash("<hello>world<!-- yo --></hello>");
hash("<hello>welt</hello>");
}
private static void hash(String xml) throws TransformerException, XMLSecurityException, IOException, GeneralSecurityException {
var transformer = TransformerFactory.newDefaultInstance().newTransformer();
var transformed = new ByteArrayOutputStream();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(transformed));
var canonicalizer = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
var canonicalized = new ByteArrayOutputStream();
canonicalizer.canonicalize(transformed.toByteArray(), canonicalized, true);
var digester = MessageDigest.getInstance("SHA-256");
var digested = digester.digest(canonicalized.toByteArray());
System.out.println(Base64.getEncoder().encodeToString(digested));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment