【问题标题】:PDFBox 2.x detect document changed after signingPDFBox 2.x 检测签名后更改的文档
【发布时间】:2018-01-04 13:48:26
【问题描述】:

我正在尝试弄清楚如何检测文档在签名后是否已更改。我似乎找不到一个好的解决方案。

有人知道吗?

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

【问题讨论】:

  • 你的意思是什么变化?更改签名中的文档哈希值或不更改?
  • 我实际上使用 ShowSignature.java 作为基础。这是我所做的:加载签名版本“PDDocument.load”然后“PDDocumentInformation info = document.getDocumentInformation();” "info.setCustomMetadataValue("NewMeta", "Dummy");" “document.setDocumentInformation(信息);” document.save...当我在 Adob​​e PDF 视图中查看文档时,它告诉我签名已损坏,但是当我通过 ShowSignature 代码运行更新的文档时,一切都很好。我错过了什么?谢谢
  • 如果您在已签名的 PDF 上执行 PDDocument.load 和后来的 document.save,则签名肯定会损坏。不过,请分享有问题的 PDF,ShowSignature 此后仍然说“一切都很好”,因为它不应该。附注:如果您为有关堆栈溢出的问题提供其他信息,特别是如果它很多或如果它是代码,请将该信息编辑到问题文本中;它下面有一个edit 链接。
  • @Anders Andrén 不幸的是,提供的两个签名链接现在都已损坏...

标签: pdfbox


【解决方案1】:

如果我通过 PDFBox 更改文档,Adobe Reader 和 PDFBox 都会检测到损坏的签名。如果我使用 Adob​​e 产品(在这种情况下为 Adob​​e Illustrator)更改文档,Adobe 将报告签名损坏

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

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

(更多细节,以及一些很少使用的中间技术,请授予this answer。)

在前一种情况下,原始文件中的签名被永久破坏,它通常不再位于 PDF 中的相同偏移量,并且签名字节肯定已更改。

在后一种情况下,由于文件的第一部分(原始文件的副本)没有任何变化,因此这种签名仍然在数学上正确地对带符号的字节进行签名。但是,在这种情况下,只有某些更改被认为是允许的,参见。 this answer.

(对于签名、增量更新和修订的一些背景,请联系this answer。)

由 PDFBox 更改的 PDF 文件(至少在您这样保存的情况下)是前一种情况的示例。

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

ShowSignature 类仅检查签名是否仍然在数学上正确地对其有符号字节进行签名。它通过输出

表示在后一种情况下添加的更改的存在
Signature does not cover whole document

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

Adobe Reader 会检查签名的数学正确性和添加的更改是否被允许。

因此,ShowSignature 不会抱怨(只是暗示存在更改),而 Adob​​e Reader 会在遇到您的 tampered.pdf 文件时抱怨。


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

如果您阅读上面已经引用的answer on allowed and dis-allowed changes,您会发现这些描述相当抽象,它们处理的是 PDF 查看器呈现的可见对象,而不是 PDF 中的数据对象。不幸的是,尽管有许多不同的方式(就 PDF 中的数据对象而言)来进行允许的更改(以 PDF 查看器呈现的可见对象表示),因此通常很难判断是否允许给定更改.

即使是对 Adob​​e Reader 中更改的分析也不完美:对于某些更改,Adobe 仅在其完成方式与 Adob​​e 软件所做的类似时才认为它们是允许的。

【讨论】:

  • 好的,我想使用“签名不覆盖整个文档”作为标记我可以弄清楚。看起来最后一个签名应该覆盖整个文档,以便认为文档是完整的。在签名方面。谢谢!
  • “看起来最后一个签名应该覆盖整个文档,才能认为文档是完整的。” - 不幸的是,这并不容易。特别是如果您必须处理 PAdES 签名(并且您有一个子过滤器 ETSI.CAdES.detached,您可以这样做),还允许对签名文件进行另一种类型的更改:验证相关信息可能总是附加到 PDF(即使是那些经过“不允许更改”认证的),并且这些 VRI 不一定由文档时间戳“签名”。
  • 所以没有万无一失的方法。知道了。再次感谢您的信息和您的时间。
  • 嗨 AndersAndrén,@mkl,有什么解决方案吗?我也面临这个问题。如果有什么好消息请告诉我。谢谢
  • 是可以解决的,但是解决它需要大量的工作,显然超出了堆栈溢出答案的范围。据我所知,这还不是一个免费的开源项目。
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多