gpt4 book ai didi

java - IText 从签名 PDF 中提取原始文件并比较哈希值

转载 作者:行者123 更新时间:2023-12-02 09:39:12 26 4
gpt4 key购买 nike

我有一份签名的 PDF。签名涵盖整个文件并且有效。

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

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

PdfReader reader = new PdfReader(FILESIGNED);
AcroFields acrofields = reader.getAcroFields();
//pdf have a unique signature
String signatureName = acrofields.getSignatureNames().get(0);
FileOutputStream os = new FileOutputStream(FILEORIGINAL);
InputStream ip = acrofields.extractRevision(signatureName);
int n = 0;
byte bb[] = new byte[1028];
while ((n = ip.read(bb)) > 0)
os.write(bb, 0, n);
os.close();
ip.close();
reader.close();

但是提取的pdf与原始的pdf不一样。我会在签名之前提取修订吗?可能吗?

感谢您的帮助。萨拉

最佳答案

I want to extract the original pdf to compare its hash with that of the unsigned pdf.

一般来说这是不可能的。

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

  1. 向 PDF 添加签名表单字段(除非存在空签名表单字段并选择用于签名);
  2. 向 PDF 添加一个字典对象,其中包含一些与签名相关的条目,特别是一个大占位符条目,最终将插入 CMS 签名容器;该字典被设置为上述表单字段的值;
  3. 向表单字段添加可视化效果,通常包含签名者证书中的一些数据(除非选择签名不可见);
  4. 如果对带有字段锁定信息的字段进行了空签名,则将其他一些表单字段设置为只读;
  5. 最终确定 PDF,即设置最后更改时间等元数据,然后将完成的 PDF 写入文件或某个字节数组;
  6. 计算完成的 PDF 的哈希值,不包括大占位符的值,但包括如上所述所做的所有其他更改;
  7. 对该哈希值进行签名,生成 CMS 签名容器;
  8. 并将此签名容器放入大占位符中。

因此,通常无法再从签名的 PDF 文件中提取“原始 pdf”,因为上述更改可能从根本上改变了 PDF 的内部结构。

不过,有一个异常(exception):如果这些更改作为增量更新应用(用 iText 行话来说:以追加模式),通常可以检索通过切断增量更新来原始。

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

关于java - IText 从签名 PDF 中提取原始文件并比较哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45998610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com