PDFBox 2.x检测签名后更改的文档

时间:2018-01-04 13:48:27

标签: pdfbox

我试图找出如何在签名后检测文档是否已更改。我似乎无法找到一个很好的解决方案。

有人知道吗?

EDIT
仅使用" ShowSignature.java "进行了一些额外的测试。这是我到目前为止所发现的。如果我通过PDFBox更改文档,Adobe Reader& PDFBox将检测破损的签名。如果我使用Adobe产品更改文档(在本例中为Adobe Illustrator),Adobe会将签名报告为已损坏," ShowSignature.java "将不会。 子过滤器是 ETSI.CAdES.detached
工作和破坏的链接:

1 个答案:

答案 0 :(得分:1)

  

如果我通过PDFBox更改文档,Adobe Reader和& PDFBox将检测破损的签名。如果我使用Adobe产品更改文档(在本例中为Adobe Illustrator),Adobe将将签名报告为已损坏

这是因为有两种基本方法可以通过更改重新保存现有PDF:

  • 您可以将更改后的PDF的所有对象保存在新文件中;或
  • 您只能将更改的对象附加到原始文件的(副本)。

(更多细节,也是实际的一些很少使用的中间技术,赋予this answer。)

在前一种情况下,原始文件中的签名被打破了,它通常不再与PDF中的相同偏移量,并且签名字节明确地已经改变。

在后一种情况下,这样的签名仍然在数学上正确地签署了签名字节,因为文件的第一部分(原始文件的副本)没有任何变化。但是,在这种情况下,只允许某些变更,参见this answer

(对于签名,增量更新和修订的某些背景,授予this answer。)

PDF文件更改的PDF文件(至少如果保存的话)就是前一种情况的一个例子。

Adob​​e Illustrator更改的PDF文件(至少在最初签名时)是后一种情况的示例。

ShowSignature类仅检查签名是否仍以数学方式正确签署其签名字节。它表示存在变化,后者通过输出

添加
Signature does not cover whole document

但它不会分析是否允许这些添加的更改。

Adob​​e Reader会检查签名的数学正确性以及允许的添加更改。

因此ShowSignature不会抱怨(只是暗示存在变化),而Adobe Reader在面对您的tampered.pdf文件时会抱怨。

PDFBox(就像大多数(所有?)其他非Adobe PDF库一样)不检查允许和禁止附加更改的原因是,这非常重要:

如果您阅读上面已经引用的answer on allowed and dis-allowed changes,您会看到描述相当抽象,它们处理PDF查看器提供的可见对象,而不处理PDF中的数据对象。不幸的是,有许多不同的方法(就PDF中的数据对象而言)来做允许的更改(用PDF查看器提供的可见对象表示),因此一般来说很难判断是否允许给定的更改

即使对Adobe Reader中的变化进行的分析也并不完美:Adobe的某些变更只会考虑它们,如果它们的完成方式类似,就像Adobe软件所做的那样。