Ich habe 2 Teile von XML-Daten, die ich habe einen Digest canonize und zu erstellen:canonize XML-Rohdaten ohne Root-Element
<header authenticate="true">
<static>
<HostID>MMM</HostID>
<TransactionID>98B230CF5FB220FD75FE916949378C2F</TransactionID>
</static>
<mutable>
<TransactionPhase>Receipt</TransactionPhase>
</mutable>
</header>
und
<TransferReceipt authenticate="true">
<ReceiptCode>0</ReceiptCode>
</TransferReceipt>
Wenn ich beide Saiten nur verketten und senden sie als byte [] zum canonnizer erhalte ich eine Ausnahme:
org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 15; Markup im Dokument nach dem Root-Element muss ordnungsgemõ▀ formatiert sein.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:338)
at org.apache.xml.security.c14n.Canonicalizer.canonicalize(Unknown Source)
at de.martinm.tools.Utils.DSTools.canonize_data(DSTools.java:141)
at de.martinm.tools.Utils.DSTools.getDigest(DSTools.java:244)
at de.martinm.tools.EBICS.EBICSKernel.send_ack(EBICSKernel.java:1039)
at de.martinm.tools.EBICS.EBICSKernel.process(EBICSKernel.java:1135)
at de.martinm.tools.EBICS.EBICSKernel.main(EBICSKernel.java:1145)
wie müssen die Daten verketten, so dass es kanonisiert werden und nach dem Senden über das Internet kann der Empfänger den Digest validieren?
Ich weiß, dass die Daten nicht XML gültig ist, da es kein einzelnes Wurzelelement hat.
Ich kann keine Beschreibung finden, wie die Daten formatiert werden müssen. Hier
ist der Code:
public byte[] getDigest(byte[] data) {
byte[] hash = null;
String algorithm="SHA-256";
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
byte[] canonical_data = canonize_data(data);
hash = digest.digest(canonical_data);
logger.debug("hash created: {}", Hex.encodeHexString(hash));
} catch (NoSuchAlgorithmException e) {
logger.error(algorithm, e);
};
return hash;
}
public byte[] canonize_data(byte[] data) {
byte[] canonical_data=null;
try {
Canonicalizer c14n = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
canonical_data = c14n.canonicalize(data);
} catch (InvalidCanonicalizerException | CanonicalizationException | ParserConfigurationException | IOException | SAXException e) {
logger.error(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS, e);
}
logger.debug("data canonized");
return canonical_data;
}
Wenn Sie nur die Dateien verketten Sie zwei Stammelemente haben, die nicht in XML erlaubt ist. Sie müssen einen anderen um sie herum wickeln oder sie irgendwie kombinieren. – daniu