我的系统中有很多 pdf。我需要检查所有这些文件是否是:-
- 数字签名
- 它们的完整性得到维护(通过将文件内容的哈希值与嵌入在 /Contents 中的消息摘要进行比较。。
我正在使用 python 来做到这一点。到目前为止,我已经能够/Content
使用 PyPDF2 从签名字典中获取。内容是 pkcs7--der 编码的。有没有办法可以提取签名的消息摘要?
C
在这个答案中进行了类似的操作
DER是二进制格式,其结构称为ASN.1。PEM 格式是 Base64 编码的 DER。
这个在线 PEM 解码器非常有用:http ://lapo.it/asn1js/识别其中的消息签名后,您可以编写代码以通过任何 ASN.1 库提取它。
CADES、CMS或PKCS#7 1.5签名的SignedData子类型具有此处定义的SignerInfo块的集合,基本上包含:
根据签名的类型,SignedAttributes 可能包含:
如果我们只使用找到的第一个签名并使用我的pyx509分支来简化它,这可能是某种类型的代码(未经测试):
from pyx509.models import PKCS7
pkcs7 = PKCS7.from_der(here_goes_your_pks7_signature_data_der_encoded)
signer_info = pkcs7.content.signerInfos[0]
auth_attrs = signer_info.auth_attributes
for attr in auth_attrs.attributes:
if attr.type == '1.2.840.113549.1.9.4': # Message Digest OID
message_digest = attr.value
print "Digest: %s#%s" % (signer_info.oid2name(signer_info.digest_algorithm), messageDigest)