XML根元素中的更改是否应该更改子元素的签名值?

XML根元素中的更改是否应该更改子元素的签名值?,xml,security,apache-camel,xml-signature,Xml,Security,Apache Camel,Xml Signature,我尝试用camel生成一个分离的XML签名文档。我注意到,如果我篡改名称空间的名称,文档将无效。例如,将“soap”名称空间更改为“soap1”名称空间会使文档无效。我得到一个: org.apache.camel.component.xmlsecurity.api.XmlSignatureInvalidValueException: Signature validation failed. The signature value could not be

我尝试用camel生成一个分离的XML签名文档。我注意到,如果我篡改名称空间的名称,文档将无效。例如,将“soap”名称空间更改为“soap1”名称空间会使文档无效。我得到一个:

org.apache.camel.component.xmlsecurity.api.XmlSignatureInvalidValueException: 
           Signature validation failed. The signature value could not be 
           validated by the public key. Either the message has been 
           tampered or the public key is not correct.
应该是这样吗

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <anotherSample attr="1234"/>
        <sample ID="sampleID"/>
        <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:SignedInfo>
                <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
                <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
                <ds:Reference URI="#sampleID">
                    <ds:Transforms>
                        <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
                    </ds:Transforms>
                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                    <ds:DigestValue>....</ds:DigestValue>
                </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>...</ds:SignatureValue>
            <ds:KeyInfo>....</ds:KeyInfo>
        </ds:Signature>
    </soap:Body>
</soap:Envelope>

....
...
....

From:
借助XPath数据模型,XML规范化可以识别名称空间。
因此,是的,更改名称空间会导致签名更改。

是的,这是正确的。篡改名称空间意味着篡改消息,因此签名无效。整个文档都用于数字签名。我似乎有一种错误的印象,即签名忽略了签名元素之外发生的事情。但这并不正确,因为它会允许XML包装攻击,这取决于ds:SignedInfo中使用的规范化算法。如果使用“独占”规范化(),子元素不会从父节点继承名称空间。这正是我所使用的,以便更灵活地处理更改为祖先/同级节点的任何内容,当然引用的节点除外。再次感谢@Moez的建议