iText pdf完整性检查

iText pdf integrity check

我有一个 pdf 文件,其中:

这是签名面板中的

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

iText 5 是否可以检测文档更改,如屏幕所示:

下面的伪JAVA代码,总是returns 完整性检查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());

感谢任何帮助或提示,如何解决这个问题。

请注意,有两种方式可以破坏集成 PDF 签名的完整性:

  • 它签名的 PDF 中的字节范围实际上发生了变化。
  • 在其签名的字节范围之后增量更新中的添加引入了不允许的更改。

iText 可以识别第一种类型的更改(使用类似于您的伪代码的代码),但它无法开箱即用地区分增量更新中允许和不允许的更改。

背景

具有多个签名的 PDF 具有如下图所示的结构:原始版本中的签名 signature1 仅对原始版本的字节进行签名。 signature2 然后签署原始版本加上版本 2 等的更改。(有关详细信息,请阅读 here and here。)

但是根据 PDF 规范,以后的版本只允许应用一组有限的更改,并且这组更改可能取决于原始签名的属性。 (有关详细信息,请阅读 here。)

您的代码,尤其是 pkcs7.verify(),只检查签名是否仍然正确地签署它所适用的字节。但是,它不检查第一个签名是否允许后来添加的更改类型。

实际上,我不知道有任何 non-Adobe 软件在执行该检查,甚至 Adob​​e 的检查也不完美:它们倾向于识别允许的更改,只有当它们以类似于 Adob​​e 的方式应用时软件会应用它。这有时会导致矛盾的陈述,例如两者

  • 文档作者不允许自应用此签名以来对此文档所做的一些更改。
  • 自应用此签名以来,此文档未发生任何更改。

检查(禁止)允许的更改

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

不幸的是,允许和不允许的更改仅根据文档在查看器中的外观或它具有的行为来描述,而不是根据允许添加哪些确切的低级别对象来描述。这将使努力高度non-trivial。