我正在尝试验证PDF的数字签名。
我知道当PDF签名时,会定义一个字节范围,证书会被嵌入,而且从我读过的内容中,签名的消息摘要和时间戳也会存储在PDF中。
我已经可以提取证书并验证它们。 现在我正在尝试验证pdf的完整性,我的问题是我不知道签名的消息摘要位于何处。
在这个来自Adobe(http://blogs.adobe.com/security/SampleSignedPDFDocument.pdf)的签名pdf示例中,我可以清楚地识别摘要,因为它低于嵌入证书:/ DigestMethod / MD5 / DigestValue /(第1520行)。
但PDF样本似乎是从2009年开始的,我怀疑消息摘要现在以不同的方式存储,因为我用Adobe Reader和iText签署了PDF,我找不到任何消息摘要字段像前一个一样。 有人可以判断摘要现在是否以不同的方式存储?他们在哪里?
无论如何,现在我正在使用Adobe的示例文档,并尝试验证其完整性。 我正在根据指定的字节范围对文档的字节进行签名,并使用MD5算法对其进行消化,但我得到的摘要值与消息摘要字段中的摘要值不匹配... 难道我做错了什么?摘要是否也与签名者的私钥签名?
我感谢任何帮助。
答案 0 :(得分:3)
在计算集成PDF签名的哈希时,有许多细节要做,其中包括:
从PDF中提取正确的字节以进行哈希。 ByteRange 可以准确地告诉您签名的字节范围。要在现代签名上下文中接受,范围必须涵盖整个PDF文件修订版,但内容的值除外。
请注意,内容 的价值包括领先的'<'和尾随''括号中。
请勿使用常规文本编辑器或文本处理说明(例如readln
或writeln
)来处理PDF。 PDF本质上是二元的,即使它们看起来是用肉眼观察的。使用此类与文本相关的操作复制PDF部件很可能会更改细节,最终会破坏签名哈希值。
如有疑问,请不要猜测,但请阅读说明书。 Adobe here已提供ISO 32000-1的副本,您可以在那里以及其中引用的其他公共标准中找到您需要了解的有关开始处理它们的PDF格式的许多内容。可以在this answer和从那里引用的文档中找到对集成PDF签名的简短介绍。