我有一个pdf文件,其中:
修订版1包含文档时间戳
加上时间戳后,添加了一些文本,但未创建新修订版
在修订版2中的文档是签名
这是来自“签名”面板
如何使用iText 5验证pdf完整性?我想检测到有人在时间戳之后(在Rev.1和Rev.2之间或在Rev.2之后)更改了文档。
iText 5是否可以通过评估Adobe Acrobat的方式检测文档更改,如屏幕所示:
自签署以来,文件已被更改或损坏。
“ 2页已修改”
下面的伪JAVA代码,总是返回完整性检查好吗?对于Rev.1 timestampField为true
PdfReader reader = new PdfReader("C:/tstEditSign.pdf");
AcroFields acro = reader.getAcroFields();
PdfPKCS7 pkcs7 = acro.verifySignature("timestampField");
System.out.println("Integrity check OK? " + pkcs7.verify());
感谢您的帮助或提示,如何解决此问题。
最佳答案
请注意,有两种方法可以破坏集成PDF签名的完整性:
它所签名的PDF中的字节范围实际上已更改。
在其标志的字节范围之后的增量更新中添加了不允许的更改。
iText可以识别第一种类型的更改(使用伪代码之类的代码),但是它不能立即区分增量更新中允许和不允许的更改。
背景资料
具有多个签名的PDF具有如下图所示的结构:原始版本中的签名signature1仅签名此原始版本的字节。然后,signature2对原始版本以及版本2的更改等进行签名。(有关详细信息,请阅读here和here。)
但是,根据PDF规范,以后的版本只允许应用一组有限的更改,而这组更改可能取决于原始签名的属性。 (有关详细信息,请阅读here。)
您的代码(尤其是pkcs7.verify()
)仅检查签名是否仍正确签名了适用于其的字节。但是,它不会检查第一个签名是否允许后来添加的更改类型。
实际上,我不知道有任何非Adobe软件可以执行该检查,甚至Adobe的检查也不是完美的:它们偏向于仅在以类似于Adobe软件应用方式的方式来应用时才允许识别允许的更改。有时这会导致矛盾的陈述,例如都
自从应用此签名以来,对该文档所做的某些更改是文档作者所不允许的。
自应用此签名以来,此文档没有进行任何更改。
在
实施检查(不允许的更改)
尽管iText不提供开箱即用的功能,但它确实为您提供了一个基础框架,您可以在该框架上尝试并实现它。特别是,您可以检索文档的每个完整的签名修订版,并在简单的PDF对象级别上比较它们的结构。
不幸的是,仅根据文档在查看器中的外观或其行为来描述允许和不允许的更改,而不是根据允许的确切低级对象添加来描述。这将使这项工作非常轻而易举。
关于java - iText pdf完整性检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49070029/