使用签名检测PDF更改

And*_*ges 4 c# pdf itext

我正在开发一个Web应用程序,允许用户下载PDF文件,他们必须使用他们的证书与Adobe Acrobat签名,然后上传回网络.

我使用的是C#itextsharp 5.5.9.0所有的PDF相关的工作.

现在,我需要检查文档从Web下载后是否未被更改.我试图做到这一点,让前加入我自己的签名到PDF文件中的用户下载(签字实现或多或少像这个问题).签名和验证工作正常,直到文件第二次签名(使用用户的证书).

在此之后,第一个签名以某种方式变得无效,我都与检查itextsharpAcroFields.SignatureCoversWholeDocument方法(返回false),并在Adobe Acrobat用户界面(截图).

所以,我有两个问题:

  1. 是否可以检查文件是否在两个签名之间被修改了?
  2. 如果不是 - 以编程方式(使用itextsharp)的替代方法是检查PDF文件在生成之后和签名之前是否已更改?

mkl*_*mkl 5

签名和验证工作正常,直到文件第二次签名(使用用户的证书).在那之后,第一个签名以某种方式变得无效

正如评论中已经阐明的那样,如果希望第一个签名保持有效,则第二个签名必须以附加模式(iText lingo)/作为增量更新(PDF规范术语)应用.否则,签名字节很可能会更改,并且签名的哈希值不再匹配.

  1. 是否可以检查文件是否在两个签名之间被修改了?

更确切地说,您的问题应该是是否可以检查两个签名之间的文档修改是否超出嵌入第二个签名的可能变化.

简而言之:在您的用例中有可能,但仍然意味着相当多的工作和使用iText低级API.详细地:

一般来说,这并非易事,因为可视化地添加了一个带有可视化的新签名

  • 由于签名可视化是窗口小部件注释,因此更改了相关页面的注释;
  • 更改PDF表单定义,因为签名锚定为表单字段;
  • 可以为其他表单字段创建外观流,以便在签名文件中修复它们的确切外观;
  • 可以更改元数据流以记录签名行为;
  • 可以改变文件的数字安全存储;
  • 可能会改变甚至更多.

因此,检查变化是否属于任何这些类别都是非常重要的.

此外,您必须检查其他作弊行为,例如,签名可视化可能涵盖整个页面并显示该内容的操纵版本......

但是你说你的用户

必须使用Adobe Acrobat签名

这可能会使您的任务变得可行:如果您使用Adobe Acrobat将样本签名添加到您之前签署的许多文档中,则可以分析Adobe Acrobat在签名时通常在文档中更改的内容.

使用这些知识,您可以实现一个类,该类检查是否只存在这些更改.

  1. 如果不是 - 以编程方式(使用itextsharp)的替代方法是检查PDF文件在生成之后和签名之前是否已更改?

如果没有您应用的第一个签名,情况将变得更加困难,因为用户的PDF签名软件没有理由限制文档中的内部结构更改,只要它们对其外部行为没有影响.所以我会尝试使用双重签名.

或者,您可以尝试将原始文档和用户签名的版本呈现为位图并进行比较.在放置用户签名可视化的区域中应该只存在差异.这不会验证交互式PDF功能,但至少会验证打印输出的完整性.

渲染还不是iText的一个特性,但解析框架同时已经发展到足以作为渲染功能的基础.


应用第一个签名甚至可以帮助防止意外更改:如果您为用户提供空签名字段并自己使用证书签名,则可以将"允许的更改"限制为仅填充该空签名字段,并且通常使用Adobe Acrobat除非另有明确说明,否则应尊重此类限制


对于集成PDF签名的背景,请查看信息安全堆栈交换的答案.