0

嗨,我正在学习和研究数字签名验证,我尝试使用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=

我试图重现这个值只是为了看看我是否理解正确。从这个问题来看。我的理解是规范化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 文件,但它仍然产生不同的值。我的理解正确吗?我如何验证摘要值以用于学习目的。

4

1 回答 1

0

阅读后我做错了:RFC3274

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

于 2019-09-12T01:58:11.087 回答