2017-12-20 4 views
0

나는 다이제스트를 시성 및 만들 내가 가지고있는 XML 데이터의 두 부분이 : 난 그냥 두 문자열을 연결하고 전송하는 경우는 루트 요소없이 원시 XML 데이터를 시성

<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) 

이 할 수 있도록 캐 노니 화되고 인터넷을 통해 전송 한 후에 수신자가 다이제스트를 확인할 수 있습니까?

데이터가 하나의 루트 요소가 없으므로 xml이 유효하지 않습니다.

데이터를 형식화하는 방법에 대한 설명을 찾을 수 없습니다. 여기

코드입니다 :

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 별도로 다음 각 조각을 시성해야합니다. 당신은 그들 주위에 다른 것을 감싸거나 어떻게 든 결합해야 할 것입니다. – daniu

답변

1

잘 구성된 XML 문서가 다른 모든 요소와 모든 텍스트 노드의 조상의 역할을 정확히 하나 개의 루트 요소를 가지고 있습니다. 그러므로 잘 구성된 두 개의 XML 문서를 간단하게 연결 한 결과 자체가 올바른 형식의 XML 문서가 아닙니다. 루트 요소가 없습니다 (또는 보려는 방식에 따라 두 개가 있습니다).

루트 요소로 사용할 컨테이너 요소를 합성하고 원본 2의 내용을 보유하여 설명 할 수 있어야합니다. 적어도, 당신은 잘 구성된 통합 문서를 그런 식으로 얻을 수 있습니다.

+0

정답입니다. – kjhughes

-1

트릭은 그냥 파일을 연결하는 경우, 당신은 XML에서 허용되지 않습니다 두 개의 루트 요소가 새로운 바이트 배열

+0

아니요, * 루트 요소가없는 * XML 데이터가 없습니다. * 문제를 해결할 때까지 전체 중지됩니다. 정답은 [** @ JohnBollinger 's answer **] (https://stackoverflow.com/a/47908679/290085)를 참조하십시오. – kjhughes

관련 문제