嗨,我正在学习和研究数字签名验证,我尝试使用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 文件,但它仍然产生不同的值。我的理解正确吗?我如何验证摘要值以用于学习目的。