2017-12-20 1 views
0

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;  
    } 
+0

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

Antwort

1

ein wohlgeformtes XML-Dokument hat genau ein Root-Element, das als Vorfahre aller anderen Elemente und alle Textknoten dient. Das Ergebnis der einfachen Verkettung zweier wohlgeformter XML-Dokumente ist daher selbst kein wohlgeformtes XML-Dokument. Es hat kein Wurzelelement (oder es hat zwei, je nachdem, wie Sie es sehen wollen).

Sie sollten in der Lage sein, das zu tun, was Sie beschreiben, indem Sie ein Containerelement synthetisieren, das als Stamm dient und den Inhalt der ursprünglichen zwei enthält. Zumindest können Sie auf diese Weise ein wohlgeformtes kombiniertes Dokument erhalten.

+0

Dies ist die richtige Antwort. – kjhughes

-1

Der Trick ist, Sie haben jeden Schnipsel separat canonize und dann Concat das empfangenen Bytes auf einen neuen Byte-Array

+0

Nein, es gibt keine * XML-Daten ohne ein Wurzelelement, * also bis zum Beheben dieses Problems. Siehe [** @ JohnBollingers Antwort **] (https://Stackoverflow.com/a/47908679/290085) für die richtige Antwort. – kjhughes