在没有根元素的情况下封装原始xml数据

时间:2017-12-20 14:44:57

标签: java xml digest canonicalization

我有2部分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>

如果我只连接两个字符串并将它们作为byte []发送到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;      
    }

2 个答案:

答案 0 :(得分:1)

格式良好的XML文档只有一个根元素,它充当所有其他元素和所有文本节点的祖先。因此,简单地连接两个格式良好的XML文档的结果本身并不是格式良好的XML文档。它没有根元素(或者它有两个,取决于你想看它的方式)。

您应该能够通过合成容器元素作为根并保留原始内容来完成您描述的内容。至少,你可以通过这种方式获得格式良好的组合文档。

答案 1 :(得分:-1)

诀窍是,你必须分别对每个片段进行封装,然后将接收到的字节连接到一个新的字节数组