对于项目,我需要检查数字签名是否有效 . 我已经开发了一段代码来完成它 . 我测试了一些pdf(正确与否),代码似乎工作 . 但有一种情况是验证不起作用 .
在Adobe Reader中,我发出消息“文档自签名以来已被更改或损坏” . 带着“美丽的”红十字......不幸的是,我不知道如何测试这个最重要的案例 .
因为如果我理解,签名是正确的,但它是改变的文件,而不是签名 .
我想我们可以使用文件的哈希,但我不知道如何正确提取这些信息 .
How to check that with Itext ?
有关信息,我测试了以下方法:
-
pdfpkcs7.verify():返回true
-
acroFields.signatureCoversWholeDocument(signame):返回true
-
pdfReader.isRebuilt():返回false
1 回答
Adobe已经记录了他们在this document中签名中接受的算法选择 . 特别是它们在其中声明所有适用的PDF版本
另一方面,OP的文档使用DSA和SHA256 . 效果是
Adobe Reader无法肯定地验证哈希值
iText(不限于那些算法组合)可以 .
实际上签名本身的签名算法信息一开始是有问题的,它只使用OID 1.2.840.10040.4.1,它只表示使用了DSA,而不是它使用的摘要算法 . 严格来说,应该使用不同的OID:
_1000_对于SHA1withDSA:1.2.840.10040.4.3
(甚至还有一些替代方案,其中大部分都被弃用了 . )
仅查找1.2.840.10040.4.1(仅DSA)验证器必须猜测/推断摘要,并假设SHA1(如Adobe Reader一样)并非完全不合理 .
iText很可能猜测使用过的SHA256,因为这个摘要算法也用于计算签名属性
messageDigest
中的文档摘要 .