IText从SIGNED PDF中提取原始内容并比较HASH

时间:2017-09-01 10:50:13

标签: java pdf hash itext signed

我有签名的PDF。签名涵盖整个文档,并且有效。

我想提取原始pdf以将其哈希值与unsigned pdf的哈希值进行比较。

我使用以下代码提取原始pdf:

typealias

但提取的pdf与原始版本不同。 我会在签名前提取修订版吗?有可能吗?

感谢您的帮助。 萨拉

1 个答案:

答案 0 :(得分:3)

  

我想提取原始pdf以将其哈希值与unsigned pdf的哈希值进行比较。

一般来说,这是不可能的。

当iText(或其他PDF签名库或应用程序)签署PDF时,他们:

  1. 向PDF添加签名表单字段(除非存在空签名表单字段并选择用于签名);
  2. 使用一些与签名相关的条目向PDF添加字典对象,特别是最大的占位符条目,最终将插入CMS签名容器;此字典设置为上述表单字段的值;
  3. 向表单字段添加可视化,通常包含签名者证书中的一些数据(除非选择签名不可见);
  4. 如果签署了具有字段锁定信息的字段的空签名,则将其他表单字段设置为只读;
  5. 最终确定PDF,即他们设置元数据,如最后更改时间,然后将完成的PDF写入文件或某个字节数组;
  6. 计算完成的PDF的哈希值,不包括大占位符的值,但包括上述所做的所有其他更改;
  7. 签署此哈希值,从而生成CMS签名容器;
  8. 并将此签名容器放入大占位符。
  9. 因此,一般来说,"原始的pdf"无法从签名的PDF文件中提取,因为上述更改可能从根本上改变了PDF的内部结构。

    但有一个例外:如果这些更改作为增量更新应用(在iText术语中:在附加模式),通常可以检索原来通过切断增量更新。

    为此,只需在签名前搜索最新的文件结束标记,然后切断。 (实际上存在少量不安全因素,最终的行尾标记可能是也可能不是原始PDF的一部分。)