我试图找出如何在签名后检测文档是否已更改。我似乎无法找到一个很好的解决方案。
有人知道吗?
EDIT
仅使用" ShowSignature.java "进行了一些额外的测试。这是我到目前为止所发现的。如果我通过PDFBox更改文档,Adobe Reader& PDFBox将检测破损的签名。如果我使用Adobe产品更改文档(在本例中为Adobe Illustrator),Adobe会将签名报告为已损坏," ShowSignature.java "将不会。
子过滤器是 ETSI.CAdES.detached
工作和破坏的链接:
答案 0 :(得分:1)
如果我通过PDFBox更改文档,Adobe Reader和& PDFBox将检测破损的签名。如果我使用Adobe产品更改文档(在本例中为Adobe Illustrator),Adobe将将签名报告为已损坏
这是因为有两种基本方法可以通过更改重新保存现有PDF:
(更多细节,也是实际的一些很少使用的中间技术,赋予this answer。)
在前一种情况下,原始文件中的签名被打破了,它通常不再与PDF中的相同偏移量,并且签名字节明确地已经改变。
在后一种情况下,这样的签名仍然在数学上正确地签署了签名字节,因为文件的第一部分(原始文件的副本)没有任何变化。但是,在这种情况下,只允许某些变更,参见this answer
(对于签名,增量更新和修订的某些背景,授予this answer。)
PDF文件更改的PDF文件(至少如果保存的话)就是前一种情况的一个例子。
Adobe Illustrator更改的PDF文件(至少在最初签名时)是后一种情况的示例。
ShowSignature
类仅检查签名是否仍以数学方式正确签署其签名字节。它表示存在变化,后者通过输出
Signature does not cover whole document
但它不会分析是否允许这些添加的更改。
Adobe Reader会检查签名的数学正确性以及允许的添加更改。
因此ShowSignature
不会抱怨(只是暗示存在变化),而Adobe Reader在面对您的tampered.pdf
文件时会抱怨。
PDFBox(就像大多数(所有?)其他非Adobe PDF库一样)不检查允许和禁止附加更改的原因是,这非常重要:
如果您阅读上面已经引用的answer on allowed and dis-allowed changes,您会看到描述相当抽象,它们处理PDF查看器提供的可见对象,而不处理PDF中的数据对象。不幸的是,有许多不同的方法(就PDF中的数据对象而言)来做允许的更改(用PDF查看器提供的可见对象表示),因此一般来说很难判断是否允许给定的更改
即使对Adobe Reader中的变化进行的分析也并不完美:Adobe的某些变更只会考虑它们,如果它们的完成方式类似,就像Adobe软件所做的那样。