せずに生のXMLデータをcanonize:私は両方の文字列を連結して送信する場合私はダイジェストをcanonizeして作成する必要がXMLデータの2箇所持つルート要素
<header authenticate="true">
<static>
<HostID>MMM</HostID>
<TransactionID>98B230CF5FB220FD75FE916949378C2F</TransactionID>
</static>
<mutable>
<TransactionPhase>Receipt</TransactionPhase>
</mutable>
</header>
と
<TransferReceipt authenticate="true">
<ReceiptCode>0</ReceiptCode>
</TransferReceipt>
をそれらはcanonnizerにバイト[]として、私は例外を取得:データを連結しなければならないのはどのよう
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)
ことができるように、インターネットを介して送信した後、受信者はダイジェストを検証できますか?
私は知っている、それは単一のルート要素を持たないので、データは有効ではありません。
データをどのようにフォーマットする必要があるのか説明が見つかりません。
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;
}
に受信したバイトCONCAT別にして、各スニペットをcanonizeしなければならない、です。あなたはそれらの周りに別のものを包むか、何とかそれらを結合する必要があります。 – daniu