使用签名

时间:2016-08-02 15:19:43

标签: c# pdf itext

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

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

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

之后,第一个签名以某种方式变为无效,我使用itextsharp的{​​{1}}方法(它返回AcroFields.SignatureCoversWholeDocument)和Adobe Acrobat UI(screenshot)进行了检查

所以,我有两个问题:

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

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

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

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

  • 更改相关页面的注释,因为签名可视化是小部件注释;
  • 更改PDF表单定义,因为签名被锚定为表单字段;
  • 可以为其他表单字段创建外观流,以便在签名文件中修复其确切外观;
  • 可能会更改元数据流以记录签名行为;
  • 可能会更改文档的数字安全存储;
  • 可能会更改。

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

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

但你说你的用户

  

必须使用Adobe Acrobat签名

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

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

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

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

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

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

应用第一个签名甚至可以帮助防止意外更改:如果您为用户提供空签名字段并自己使用证书签名,则可以限制允许的更改"除了明确告知其他情况外,Adobe Acrobat通常会尊重这些限制。

有关集成PDF签名的背景,请查看信息安全堆栈交换中的this answer