当前位置: 首页 > 知识库问答 >
问题:

PDF签名摘要

盖嘉珍
2023-03-14

我有一个关于计算PDF文档摘要以用于数字签名的快速问题(与我前面的一个问题有点相关,我试图弄清楚为什么您需要知道客户的证书以创建正确的摘要)。在Adobe关于PDF格式的文档中,指定了以下内容:

字节范围摘要应在文件中的一个字节范围内计算,该范围应由签名字典中的字节范围条目指示。这个范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目)。

因此,在这一点上,事情似乎相当简单,只需消化除/sig字典中的/contents条目之外的所有内容。/contents条目中的实际数据指定如下:

对于公钥签名,内容应该是DER编码的PKCS#1二进制数据对象或DER编码的PKCS#7二进制数据对象。

所以仍然没有问题,我可以(可能)生成摘要,为/contents条目保留空间,并在稍后附加这个PKCS#7对象。当我读到以下内容时,我就开始感到困惑:

撤销信息是一个已签名的属性,这意味着签名软件在签名之前必须捕获撤销信息。类似的要求也适用于证书链。签名软件必须在签名之前捕获并验证证书链。

所以我不太明白的是:显然/contents条目(包含证书和签名摘要)没有被消化,但是证书链是一个签名属性(因此需要消化?)。

如果有人能进一步具体说明消化的内容,或许能更好地向我解释签名的属性,我将不胜感激。我想要回答的主要问题是:在事先不知道某人的证书的情况下,我实际上可以创建一个可签名的摘要吗?(我正在使用pkcs7分离签名)

共有1个答案

薛烨霖
2023-03-14

我可以在事先不知道某人的证书的情况下创建一个可签名的摘要吗?

在子筛选器etsi.cades.detached或adbe.pkcs7.detached的情况下,您可以创建文档摘要,而不必事先知道某人的证书。

但是,在开始生成CMS签名容器以嵌入PDF之前,您通常必须知道签名者证书。

我可以(可能)生成摘要,为/contents条目保留空间,并在稍后附加这个PKCS#7对象。

如果您首先保留空间,然后生成摘要,那么实际上就是这样做的。

当我读到以下内容时,我就开始感到困惑:

必须注意的主要事实是,在PKCS#7/CMS签名容器的情况下,签名通常不仅仅包括一个哈希计算,而是至少包括两个哈希计算!

第一个散列,即文档散列,实际上是为整个文件计算的,包括签名字典,但不包括签名值本身(内容条目)(您可能需要阅读此答案以了解更多详细信息)。

但这不是应用签名算法时立即使用的哈希。

在生成PKCS#7/CMS签名容器的过程中(除非是其最原始的形式),您会创建一个称为“Signed Attributes”的结构。

您使用多个属性(名称-值-对)填充这个结构,其中包括已经计算的文档哈希,还有其他属性,例如您读到的Adobe风格的撤销信息。

完成该结构的创建后,对该结构进行哈希并为其生成签名。

然后,您可以使用这些签名属性、签名和一些未被此签名签名的更多信息(例如证书、签名时间戳、...)来组合PKCS#7/CMS签名容器。

有关签名容器的详细信息,请阅读以下答案。

最后,您将此签名容器嵌入到PDF中的保留空间中。

但是,根据CMS签名配置文件,在开始生成签名容器之前,您通常必须了解签名者证书,因为许多配置文件都要求存在引用签名者证书的签名属性。

OP在评论中提出了一些后续问题:

1.:其中一个带符号的属性是文档哈希(没有/contents),所以如果我理解正确的话,这就是未带符号的哈希?

不,“Signed Attributes”结构的散列,它只是PKCS#7对象的一部分,而不是全部。PKCS#7/CMS对象有多个未签名部分。

Contents条目包含一个完整的PKCS#7/CMS签名容器对象(二进制字符串)。因此,是的,您可以读取它(通过读取那个二进制字符串的值)并(如果您有知道如何解析这样的签名容器的代码)从中提取信息。

但是要注意,签名容器可能不包含验证所需的所有数据:例如,如果使用链(而不是shell)验证模型进行验证,则可能必须从相应的PDF签名字典条目中提取签名时间。

显然,您还必须计算签名PDF字节范围的摘要,并将该值与包含原始文档摘要的签名属性进行比较。(您可能是通过重新计算摘要来表示这个意思的。)

如3的答案所述,您可能必须从PDF中检索其他信息,以便在PKCS#7验证中使用。

此外,您说我们从PKCS#7对象获得的证书-请注意PKCS#7/CMS签名容器可能包含多个证书。你得找到正确的。应使用CMS SignerInfo SignerIdentifier和ESS signed属性。

你可以开始阅读了

  • RFC 3852或RFC 5652的第11节“有用属性”:基本CMS
  • ISO 32000-1第12.8节:基本PDF
  • 全部RFC 5126:CADES
  • ETSI TS 102778,特别是第2、第3和第4部分:页
 类似资料:
  • 我正在尝试为PDF签名执行以下设置,将其分解为客户端和服务器之间的异步步骤: null 我所做的基本上是将该摘要发送给客户机进行签名,然后在服务器上重做上述步骤并设置客户机签名: 此设置最终导致文件完整性被破坏,因为在服务器上嵌入后,我要创建一个新的PDSignature。有没有一种方法可以序列化调用addSignature后创建的PDDocument,这样我以后就可以在服务器上反序列化它并添加客

  • 我正在编写一个Java web服务,它使用来自网络中一些客户端的iText对PDF文档进行签名。文档的签名正确,可以使用外部工具进行验证。然而,由于一些法律限制,为了将此文档存储在一个正式的文档存储库中,我必须提供来自签名的散列/摘要消息。 我已经尝试了几乎所有的方法来获得那个散列,但我能得到的最接近的方法是用下面的代码段以字符串的形式获得整个签名(证书+散列/摘要+时间戳)(请原谅字符串和[1]

  • Client=My application,Server=MSSP(移动签名服务提供商) 服务器仅对哈希值进行签名。 要签名数据: *Base64编码的SHA-384待签名数据摘要。(64个字符) *Base64编码的SHA-512待签名数据摘要。(88个字符) *要签名的Base64编码的DER编码的PKCS#1摘要信息。 注意:我使用MSSP(移动签名服务提供商)架构。对于SHA256算法,D

  • 问题内容: 我正在编写一个Java网络服务,该网络服务从网络中的某些客户端使用iText对PDF文档进行签名。文档已正确签名,可以使用外部工具进行验证。但是,由于某些法律限制,为了将此文档存储在正式的文档库中,我必须提供签名中的哈希/摘要消息。 我已经尝试了几乎所有方法来获取该哈希,但是我可以获取的最接近的方法是使用此代码段将整个签名(CERT + HASH / DIGEST + TIMESTAM

  • 问题内容: 目前,我有一个客户端-服务器应用程序,给定一个PDF文件,使用服务器证书对其进行签名,将签名与原始文件一起附加,然后将输出返回给客户端(所有这些操作均通过PDFBox实现)。 我有一个签名处理程序,这是我的外部签名支持(其中内容为PDF文件) 它工作正常,但我在想-如果PDF文件太大而无法上传怎么办?例如:100mb …这将永远!鉴于此,我想弄清楚,如果不对PDF文件签名,是否可以仅对

  • 我正在尝试通过签名服务签署一个pdf文件。这个服务需要发送一个十六进制编码的SHA256摘要,作为回报,我会收到一个十六进制编码的SignatureValue。此外,我还收到了签名证书、中间证书、OCSP响应和TimeStampToken。但是,我在尝试使用SignatureValue对pdf进行签名时已经陷入了困境。 我读过布鲁诺的白皮书,过度浏览互联网,尝试了很多不同的方式,但签名不断出现无效