iText pdf完整性检查

时间:2018-03-02 13:24:51

标签: java pdf itext integrity

我有一个pdf文件,其中:

  • 启。 1包含文档时间戳
  • 在加时间戳之后添加了一些文本而没有创建新版本
  • Rev. 2文件中的
  • 是signes

以下是“签名”面板中的Adobe Acrobat screen

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

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

  • '文件自签署后已被更改或损坏。'
  • ' 2页已修改'

下面的伪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());

感谢您提供任何帮助或提示,如何解决此问题。

1 个答案:

答案 0 :(得分:1)

请注意,有两种方法可以违反集成PDF签名的完整性:

  • 其签名的PDF中的字节范围实际上已更改。
  • 在其签名的字节范围引入不允许的更改后,在增量更新中添加。

iText可识别第一种类型的更改(使用类似伪代码的代码),但它无法区分增量更新中允许和禁止的更改。

背景

structure

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

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

您的代码,尤其是pkcs7.verify(),仅检查签名是否仍然正确地标记了它应用的字节。但是,它不会检查第一个签名是否允许后续添加引入的更改类型。

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

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

enter link description here

实施(dis)允许更改的检查

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

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