我想手动验证一个签名的pdf的完整性。我已经接触到:-
PyPDF2)。这是一个der编码的PKCS#7证书。现在,根据pdf specifications,pdf数据的消息摘要与证书一起存储在/Content节点中。尝试了很多次,但我无法得到摘要值,我最终会与散列pdf内容(由/ByteRange指定)进行比较。

不明白最后一部分说的write signature object data into the dictionary。这种写在哪里发生,我如何提取消息摘要?
发布于 2015-02-10 11:00:04
(这与其说是回答,不如说是评论。由于评论的大小和格式限制,我还是把它放到了一个答案中。)
PDF中的签名
在先前问题中,OP已经插入了一个草图,说明在SubFilter ETSI.CAdES.detached,adbe.pkcs7.detached或adbe.pkcs7.sha1中嵌入了一个签名。

但这只是一个草图,如果解释得太过,可能会造成错误的印象,即签名字典中的Content条目的值类似于包含“证书”、“签名消息摘要”和“时间戳”的列表。此外,将此列表称为“签名值”也会混淆,因为该名称也用于内容的一小部分,参见下面。
指定了实际内容(cf )。( 本文件)作为:
当使用PKCS#7签名时,内容的值应该是包含签名的经过编码的PKCS#7二进制数据对象。PKCS#7对象应符合RFC3852加密消息语法。
(顺便说一句:这里的规范要求数据对象进行DER编码,但是在野外有许多签名的PDF,它们对整个对象使用一些不那么严格的误码率编码,而DER只对RFC3852所要求的部分使用DER编码。)
PKCS#7二进制数据对象
包含更准确地符合RFC3852的签名的RFC3852二进制数据对象是一个具有SignedData内容的ContentInfo对象,通常命名为“签名容器”。
根据RFC 3852
CMS将内容类型标识符与内容关联。语法必须具有ASN.1类型的ContentInfo: ContentInfo ::=序列{
contentType ContentType,
content [0] EXPLICIT ANY DEFINED BY contentType }符号数据内容类型应具有ASN.1类型SignedData: SignedData ::= SEQUENCE {
version CMSVersion,
digestAlgorithms DigestAlgorithmIdentifiers,
encapContentInfo EncapsulatedContentInfo,
certificates [0] IMPLICIT CertificateSet OPTIONAL,
crls [1] IMPLICIT RevocationInfoChoices OPTIONAL,
signerInfos SignerInfos }在这里,您可以看到可选的集合certificates,其中通常至少包含签名者证书以及它的颁发者证书链。这是上面素描中的“证书”。
您还可以看到包含实际签名信息的signerInfos结构:
SignerInfos ::= SignerInfo每签名者信息集表示为SignerInfo: SignerInfo ::=序列{。
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }属性SignedAttributes ::= SET SIZE (1..MAX)属性::=序列{
attrType OBJECT IDENTIFIER,
attrValues SET OF AttributeValue }(在这里,您可以看到RFCs称为SignatureValue的结构。)如前所述,上面调用整个签名容器“签名值”的草图可能会混淆,因为下面已经是一个名为“签名值”的类型的实体。)
您需要的是adbe.pkcs7.分离类型PDF签名的签名PDF字节范围的消息摘要。实际上有两种可能性:
SignerInfo实例中,很少有SignedAttributes。在这种情况下,SignatureValue是直接应用于有符号字节范围的签名算法的值。如果签名算法基于RSA,则可以通过使用签名者的公钥(从其证书中)解码该值并从已解码的DigestInfo对象中提取摘要来检索文档摘要值。
DigestInfo ::= SEQUENCE {
digestAlgorithm DigestAlgorithmIdentifier,
digest Digest }如果签名算法基于DSA或EC DSA,则根本无法检索摘要值。这些算法只允许您检查所提供的摘要值(例如,在检索文档时对文档的有符号字节范围进行了散列)是否为原始签名值。
SignerInfo的SignedAttributes实例中,更常见的情况是,您必须搜索这些SignedAttributes以查找消息摘要属性,该属性由id-消息摘要对象标识符::= { iso(1)成员-主体(2)
us(840) rsadsi(113549) pkcs(1) pkcs9(9) 4 }不过,正如注释中已经提到的,我无法解释如何使用Python或openssl在这里进行深入研究。您需要一些工具来了解这些特定的ASN.1结构或ASN.1结构。
https://stackoverflow.com/questions/28408047
复制相似问题