我正在用 JavaScript 开发 Pades 签名验证工具。 我使用 adobe Acrobat 生成了一个签名的 pdf 文件,用作测试文件;我注意到签名字典中的 M 键不是 (D:UtcTime) 形式,例如:(D:20220524124230Z) 而是一个字节序列。我该如何解码?
您的 PDF 很可能已加密。在加密的 PDF 中,几乎所有字符串和流都被加密。 PDF 中的日期是特殊格式的字符串,因此它们也被加密。
要对其进行解码,请分析 PDF 的加密字典并解密日期值。
在评论@sodastream声称:
这里有一个矛盾。您要么签名,要么加密。对已签名的 PDF 进行加密会导致无法验证签名。这样就失去了签名的意义。
不,这并不矛盾,PDF 可以同时加密和签名,并且签名仍然可以被验证。
您仅在以下方面正确:加密签名的 PDF(即先不加密签名,然后加密这个已签名的 PDF)没有任何意义:在这种情况下加密会更改签名数据的字节,从而呈现签名无效。
但是签署已经加密的PDF(即在准备和序列化签名时已经加密了PDF)确实有意义:这里为已经加密的字节创建签名,并且如果满足以下条件则可以正确验证签名:验证者知道密码。而且往往加密只是用来限制文件权限,使用众所周知的默认密码作为用户密码。
而且这种情况并不少见。例如。默认情况下,Adobe Acrobat Sign 服务会使用加密和 Adobe 数字签名来保护其签名的 PDF,以禁止和防止更改。