2016-12-05 48 views
0

对于一个项目,我需要检查数字签名是否有效。 我已经开发了一段代码来做到这一点。 我测试了一些pdf(正确与否),代码似乎工作。 但有些情况下验证不起作用。如何检测签名的pdf与iText一起使用?

在Adobe Reader中我有一条消息“文档自签名以来已被更改或损坏。”用“美丽”的红色十字... 不幸的是,我不知道如何测试这个最重要的案例。

因为如果我理解,签名是正确的,但它是被更改的文档,而不是签名。

我想我们可以使用文件的散列,但我不知道如何正确提取这些信息。

如何用Itext检查?

有关信息,我测试的方法如下:

  • pdfpkcs7.verify():返回true
  • acroFields.signatureCoversWholeDocument(signame):返回true
  • pdfReader .isRebuilt():return false
+0

请分享有问题的PDF。考虑到你发布的测试方法结果,我会*假设*所讨论的pdf已经设置了它的** NeedAppearances **标志。这会导致Adobe Reader在打开更改签名数据的文件时重新创建表单字段外观。另一个选项可能是带有使用Adobe不支持的签名算法的签名的pdf。 – mkl

+0

感谢您的帮助,文档链接:https://drive.google.com/file/d/0B8fLGZLVFcLyeXF0TjluNzRjT3c/view?usp=sharing 错误发生在测试期间有一段时间,我忘了我是如何生成它的.... – ke20

+1

我其实还不确定。目前,我赞成Adobe Reader不支持文档中使用的算法组合的假设。 Adobe Reader仅支持非常有限的一组算法,参见参考资料。 [Acrobat_DigSig_AlgorithmsAll](http://www.adobe.com/devnet-docs/acrobatetk/tools/QuickKeys/Acrobat_DigSig_AlgorithmsAll.pdf),它不断声明*“DSA仅支持SHA1”*。另一方面,您的PDF将DSA与SHA-256结合使用。 iText使用的安全库BouncyCastle支持更多的算法和算法组合。 – mkl

回答

1

Adob​​e已经记录了他们在this document中签名中接受的算法的选择。特别是他们为所有适用的PDF版本

DSA其中国家只支持SHA1和adbe.pkcs7.detached

的OP的文档,而另一方面,使用DSA与SHA256。其效果是,

  • 的Adobe Reader可不主动验证的散列值,但
  • iText的(未限制本身的那些算法组合)即可。

其实在签名时的签名算法信息本身是有问题的,开始时,它仅仅使用OID 1.2.840.10040.4.1这只是表明DSA使用,而不是摘要算法被使用。严格地说不同的OID应该已经用于:

  • 为SHA1的DSA:1.2.840.10040.4.3
  • 为SHA256withDSA:2.16.840.1.101.3.4.3.2

(甚至有一些其中大多数同时已被弃用。)

仅查找1.2.840.10040.4.1(仅DSA)验证程序必须猜测/推导摘要,并假设SHA1(如Adobe Reader)并不完全不合理。

iText很可能会猜测使用的SHA256,因为此摘要算法也用于计算签名属性messageDigest中的文档摘要。