xmlsec 和 openssl 中生成的摘要值不同

Digest value generated in xmlsec and openssl are different

您好,我正在学习和研究数字签名验证,我尝试使用 xmlsec 库。使用 xmlsec 和示例中的代码:

parser = etree.XMLParser(remove_blank_text=True)
template = etree.parse('test.xml', parser).getroot()

signature_node = xmlsec.tree.find_node(template, xmlsec.constants.NodeSignature)
ctx = xmlsec.SignatureContext()
key = xmlsec.Key.from_file('keys/private_key.pem', xmlsec.constants.KeyDataFormatPem)
ctx.key = key
ctx.sign(signature_node)
formated = etree.tostring(template)

with open('xmlsec_formatted.xml', 'wb') as the_file:
    the_file.write(formated)

它生成了一个新文件,其摘要值为:izbIdQ4tSAg6VKGpr1zd6kU9QpVQi/Bcwxjxu/k2oKk=

我试图重现这个值只是为了看看我是否理解正确。如from this question。我的理解是,在规范化 xml 之后(我使用了下面的代码)

from lxml import etree

parser = etree.XMLParser(remove_blank_text=True)

xmlTree = etree.parse('test.xml', parser)
root = xmlTree.getroot()
formated = etree.tostring(root, method='c14n')
with open('canon.xml', 'wb') as the_file:
        the_file.write(formated)

我只需要对其进行哈希处理并将其编码为 base64。从另一个问题,我尝试了以下 openssl 命令: openssl dgst -binary -sha256 canon.xml | openssl enc -base64。然而,它产生了这个摘要值:YAzI0t93fuMTBIGkLeYC5VVPyaM0FziBLP5fF6qojbw= 我也尝试使用初始 xml 文件,但它仍然产生不同的值。 我的理解正确吗?我如何验证摘要值以供学习之用。

看完我做错了:RFC3274

我需要解码 obj 元素而不是实际的 xml 文件本身。解码 obj 元素并应用正确的哈希后,我得到了相同的结果。