Java iText pdf完整性检查

Java iText pdf完整性检查,java,pdf,itext,integrity,Java,Pdf,Itext,Integrity,我有一个pdf文件,其中: 牧师。1包含文档时间戳 在时间戳之后,添加了一些文本,但没有创建新的修订 在Rev。2份文件被签署 这是签名小组的签名 如何使用iText 5验证pdf完整性?我想检测,有人在Rev.1和Rev.2之间的时间戳之后,或者在Rev.2之后更改文档。2. iText 5是否可以在Adobe Acrobat评估时检测文档更改,如屏幕所示: “文档自签名后已被更改或损坏。” “已修改2页” 下面的伪JAVA代码,总是返回完整性检查OK?适用于Rev.1时间戳字段 PdfR

我有一个pdf文件,其中:

牧师。1包含文档时间戳 在时间戳之后,添加了一些文本,但没有创建新的修订 在Rev。2份文件被签署 这是签名小组的签名

如何使用iText 5验证pdf完整性?我想检测,有人在Rev.1和Rev.2之间的时间戳之后,或者在Rev.2之后更改文档。2.

iText 5是否可以在Adobe Acrobat评估时检测文档更改,如屏幕所示:

“文档自签名后已被更改或损坏。” “已修改2页” 下面的伪JAVA代码,总是返回完整性检查OK?适用于Rev.1时间戳字段

 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的更改进行签名。详细信息请阅读并确认

但根据PDF规范,更高版本只允许应用有限的一组更改,而这组更改可能取决于原始签名的属性。详情请阅读

您的代码,特别是pkcs7.verify,只检查签名是否仍然正确地对其应用的字节进行签名。不过,它不会检查由后来的添加引入的更改是否被第一个签名所允许

事实上,我不知道有任何非Adobe软件执行该检查,甚至Adobe的检查也不是完美的:只有当它们以类似于Adobe软件应用的方式应用时,它们才会倾向于识别允许的更改。这有时会导致相互矛盾的陈述,例如

文件作者不允许自应用此签名以来对本文件所做的某些更改。 自应用此签名以来,未对本文件进行任何更改。 在

对不允许的更改执行检查 虽然iText不提供这种开箱即用的检查,但它确实为您提供了一个基本框架,您可以自己尝试并实现它。特别是,您可以检索文档的每个完整签名版本,并在简单PDF对象级别上比较它们的结构


不幸的是,允许和不允许的更改仅根据文档在查看器中的外观或其具有的行为来描述,而不根据允许添加的确切低级对象来描述。这将使这项工作变得非常重要。

简单地说:在iText中没有明确实现确定修订之间更改的性质,但它为您提供了一个底层PDF访问框架,您可以自己实现这一点。准备好花几个月的时间在一个像样的实现上。