如何在java中使用sha-256计算XML头和体的校验和

如何在java中使用sha-256计算XML头和体的校验和,java,jaxb,sha256,sha,Java,Jaxb,Sha256,Sha,我需要使用sha-256计算以下XML的头和有效负载的校验和,并将其写入拖车节点(校验和元素)的相同XML中。 我已经在下面的链接中复制了源代码 我在互联网上搜索了它,但没有找到我正在寻找的解决方案。它们中的大多数都是从物理位置读取xml文件并进行转换。 但是,我不会将XML写在文件中(它仅用于参考,不用于任何其他目的)。我需要计算报头和有效载荷的校验和,然后将其写在移动的拖车部分,并将其发送到Solace主题 如何使用sha-256计算XML头和体的校验和数据 <?xml versio

我需要使用sha-256计算以下XML的头和有效负载的校验和,并将其写入拖车节点(校验和元素)的相同XML中。 我已经在下面的链接中复制了源代码

我在互联网上搜索了它,但没有找到我正在寻找的解决方案。它们中的大多数都是从物理位置读取xml文件并进行转换。 但是,我不会将XML写在文件中(它仅用于参考,不用于任何其他目的)。我需要计算报头和有效载荷的校验和,然后将其写在移动的拖车部分,并将其发送到Solace主题

如何使用sha-256计算XML头和体的校验和数据

<?xml version='1.0' encoding='UTF-8'?>
<canonMessage xmlns="http://www.test.com/canon/v1">
    <header>
        <metadata>
            <domain>
                <name>party</name>
                <schemaVersion>1.0</schemaVersion>
                <subdomain>
                    <name>employee</name>
                </subdomain>
            </domain>
            <identifier>
                <id idScheme="HRSystem/lanId">SHawking</id>
            </identifier>
            <source>HRSystem</source>
            <messageId>84ec00d0-2a33-11eb-ae59-0050569a5c1d</messageId>
        </metadata>
    </header>
    <payload>
        <employee xmlns="http://www.test.com/party/employee/v1">
            <employeeId>79498</employeeId>
            <lanId>SHawking</lanId>
            <name>
                <lastName>Hawking</lastName>
                <firstName>Steve</firstName>
            </name>
            <businessTitle>Client Manager</businessTitle>
            <status>A</status>
            <groupName>Management</groupName>
            <departmentName>Legal</departmentName>
            <costCentre>RUSYDFGLEG</costCentre>
            <officeLocation>Texas</officeLocation>
            <region>US</region>
        </employee>
    </payload>
    <auditRecords>
        <sourceAuditRecord>
            <system>HRSystem</system>
            <timestamp>
                <created>2020-11-19T17:50:32.84+11:00</created>
                <sent>2020-11-19T17:50:32.84+11:00</sent>
            </timestamp>
        </sourceAuditRecord>
    </auditRecords>
    <trailer>
        <checksum type="sha-256">f60875e4905b62ed188ca61aee75fcfe354ae57fba4cabc8aba093d86a001569</checksum>
    </trailer>
</canonMessage>

聚会
1
雇员
肖金
人力资源系统
84ec00d0-2a33-11eb-ae59-0050569a5c1d
79498
肖金
霍金
史蒂夫
客户经理
A.
管理层
合法的
Rusydfgleeg
得克萨斯州
美国
人力资源系统
2020-11-19T17:50:32.84+11:00
2020-11-19T17:50:32.84+11:00
F60875E4905B62ED188CA61AEE75FCFE354AE57FBA4CABC8ABA0093D86A001569
XML数字签名 JavaXML数字签名API是用于生成和验证的标准JavaAPI

API由定义


该接口允许您对签名进行签名和验证。

此XML不是来自该文件。我使用JAXB生成XML并向其添加校验和。以上是文件中的XML。我封送java对象并将其作为字符串获取。我需要做的是使用DigestUtils.sha256Hex()计算校验和数据。我尝试将头和主体java对象作为字符串传递,如“DigestUtils.sha256Hex(xml.getHeaderdata().toString()+xml.getBody().toString())”。但是,我不确定这是否是正确的方法,因为XML也包含哈希,所以不能对整个XML进行哈希。签名仅使用某些元素计算。对“.toString()”进行散列不是一个好主意。XML加密使用XMLSignatureFactory工作,唯一有文档记录的工厂是DOM。对于签名,您需要封送JAXB并解析输出以获得dom文档和signit。为了验证类似的事情。为JAXB提供一个XMLSignatureFactory会很好,但在我们的例子中,现有系统遵循相同的模式,将XML转换为字符串并计算报头和有效负载之间的校验和。我已经按照同样的方法计算过了,它被接受了。谢谢你的宝贵意见