我有一个pdf文件,其中:
以下是“签名”面板中的
如何使用iText 5验证pdf的完整性?我想检测一下,有人在时间戳之后(Rev.1和Rev.2之间,或Rev.2之后)更改文档。
iText 5是否可以检测文档更改,如Adobe Acrobat评估的那样,如屏幕所示:
下面的伪JAVA代码,总是返回完整性检查OK?对于Rev.1 timestampField
,为真 PdfReader reader = new PdfReader("C:/tstEditSign.pdf");
AcroFields acro = reader.getAcroFields();
PdfPKCS7 pkcs7 = acro.verifySignature("timestampField");
System.out.println("Integrity check OK? " + pkcs7.verify());
感谢您提供任何帮助或提示,如何解决此问题。
答案 0 :(得分:1)
请注意,有两种方法可以违反集成PDF签名的完整性:
iText可识别第一种类型的更改(使用类似伪代码的代码),但它无法区分增量更新中允许和禁止的更改。
具有多个签名的PDF具有如下图所示的结构:原始版本中的签名signature1仅标记此原始版本的字节。签名2然后签署原始版本加上版本2等的更改。(有关详细信息,请阅读here和here。)
但是根据PDF规范,只允许更高版本应用一组有限的更改,这组更改可能取决于原始签名的属性。 (有关详细信息,请阅读here。)
您的代码,尤其是pkcs7.verify()
,仅检查签名是否仍然正确地标记了它应用的字节。但是,它不会检查第一个签名是否允许后续添加引入的更改类型。
实际上我并不知道有任何非Adobe软件执行该检查,甚至Adobe的检查也不完美:只有在以类似于某种方式的方式应用它们时,它们才会偏向于识别允许的更改Adobe软件将如何应用它。这有时会导致相互矛盾的陈述,例如:两个
在
虽然iText不提供开箱即用的检查,但它确实为您提供了一个基础框架,您可以自己尝试并实施它。特别是,您可以检索文档的每个完整签名修订版本,并在简单PDF对象的级别上比较它们的结构。
不幸的是,允许和不允许的更改仅根据文档在查看器中的外观或其具有的行为来描述,而不是根据允许的哪些精确的低级别对象添加。这将使努力变得非常重要。