使用签名检测PDF更改

本文关键字:PDF 更改 检测 | 更新日期: 2023-09-27 17:59:52

我正在开发一个web应用程序,让用户下载一个PDF文件,他们必须使用证书用Adobe Acrobat签名,然后上传回web。

我使用C#itextsharp 5.5.9.0进行所有与PDF相关的工作。

现在,我需要检查文档在从网上下载后是否没有被更改。我试图通过在让用户下载PDF文件之前将我自己的签名添加到PDF文件中来做到这一点(签名或多或少像这个问题中那样实现)。签名和验证工作正常,直到文件第二次签名(使用用户证书)。

在那之后,第一个签名不知何故变得无效,我用itextsharpAcroFields.SignatureCoversWholeDocument方法(它返回false)和Adobe Acrobat UI(屏幕截图)进行了检查。

所以,我有两个问题:

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

使用签名检测PDF更改

签名和验证工作正常,直到文件第二次签名(使用用户证书)。在那之后,第一个签名不知何故变成无效的

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

  1. 是否有可能在两个签名之间检查文件是否被修改

更确切地说,你的问题应该是是否有可能检查两个签名之间的文件修改是否超过了嵌入第二个签名的可能更改。

简言之:在您的用例中,这是可能的,但仍然意味着要做一些工作,并与iText低级API打交道详细信息:

一般来说,这并不是一件小事,因为添加一个具有可视化功能的新签名似乎是

  • 由于签名可视化是小部件注释,所以改变所讨论的页面的注释
  • 在签名被锚定为表单字段时更改PDF表单定义
  • 可以为其他表单字段创建外观流,以修复它们在签名文件中的确切外观
  • 可以改变元数据流以记录签名行为
  • 可以改变文档的数字安全存储
  • 可能会发生更大的变化

因此,检查更改是否属于这些类别中的任何一个都是非常重要的。

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

但你说你的用户

必须使用Adobe Acrobat 进行签名

这可能会使您的任务在一定程度上可行:如果您使用Adobe Acrobat将样本签名添加到之前首先签名的多个文档中,则可以分析Adobe Acrobat在对文档进行签名时通常会对文档进行哪些更改。

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

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

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

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

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


应用第一个签名甚至有助于防止意外更改:如果您为用户提供一个空的签名字段,并自己使用证书签名,则可以将"允许的更改"限制为只填充该空签名字段,除非另有明确指示,否则Adobe Acrobat通常会遵守这些限制。


有关集成PDF签名的背景信息,请参阅信息安全堆栈交换上的此答案。