2017-12-20 10 views
0

せずに生の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;  
    } 
+0

に受信したバイトCONCAT別にして、各スニペットをcanonizeしなければならない、です。あなたはそれらの周りに別のものを包むか、何とかそれらを結合する必要があります。 – daniu

答えて

1

整形式XML文書は、すべての他の要素とすべてのテキストノードの祖先として機能正確1つのルート要素を有している:ここ

コードです。したがって、2つの整形式XML文書を単純に連結した結果は、それ自体が整形式XML文書ではありません。それはルート要素を持っていません(またはそれを見たい方法に応じて2つあります)。

コンテナ要素を合成してルートとして機能させ、元の2つの内容を保持することで、説明することができるはずです。少なくとも、あなたはそのように整形された結合文書を得ることができます。

+0

これは正解です。 – kjhughes

-1

トリックは、あなたがあなただけのファイルを連結した場合、あなたはXMLで許可されていない2つのルート要素を持つ新しいバイト配列

+0

いいえ、ルート要素のない* XMLデータはありません。*その問題を解決するまで完全に停止します。正解については、[** @ JohnBollinger's answer **](https://stackoverflow.com/a/47908679/290085)を参照してください。 – kjhughes

関連する問題