Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IText从签名PDF中提取原始文件并比较哈希_Java_Pdf_Hash_Itext_Signed - Fatal编程技术网

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

Java IText从签名PDF中提取原始文件并比较哈希,java,pdf,hash,itext,signed,Java,Pdf,Hash,Itext,Signed,我有一个签名的PDF。签名涵盖了整个文件,并且是有效的 我想提取原始pdf,将其哈希值与未签名pdf的哈希值进行比较 我使用以下代码提取原始pdf: PdfReader reader = new PdfReader(FILESIGNED); AcroFields acrofields = reader.getAcroFields(); //pdf have a unique signature String signatureName = acrofields.getSignatureNames

我有一个签名的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,将其哈希值与未签名pdf的哈希值进行比较

一般来说,这是不可能的

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

  • 将签名表单字段添加到PDF(除非存在空签名表单字段并选择用于签名)
  • 向PDF添加一个字典对象,其中包含一些与签名相关的条目,特别是一个大占位符条目,最终将插入CMS签名容器;该字典被设置为上述表单字段的值
  • 向表单字段添加可视化,通常包含来自签名者证书的一些数据(除非签名被选择为不可见)
  • 如果为具有字段锁定信息的字段签名为空,则将其他一些表单字段设置为只读
  • 完成PDF,即他们设置元数据,如上次更改的时间,然后将完成的PDF写入文件或某个字节数组
  • 计算完成PDF的哈希值,不包括大占位符的值,但包括如上所述的所有其他更改
  • 对该散列值进行签名,生成CMS签名容器
  • 然后把这个签名容器放到大占位符中
  • 因此,通常无法从签名的pdf文件中提取“原始pdf”,因为上述更改可能已经从根本上改变了pdf的内部结构

    但有一个例外:如果这些更改作为增量更新应用(在iText行话中:在append模式下),通常可以通过切断增量更新来检索原始文件


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

    0向下投票接受感谢帮助。我还有一个要求。我读过这张票:从签名的pdf中获取原始内容如果我有一个签名,就不可能提供原始pdf。但是如果我有更多的签名(修订版),从修订版n.2可以得到修订版n.1。我的问题是:可以在pdf中创建第一个修订版(例如添加隐藏注释),然后添加签名。因此,更容易获得文件的先前版本。谢谢你help@Sara为了能够获得原始版本,必须将第一个签名作为增量更新应用;当您使用iText时,这意味着使用append模式。(您需要使用
    PdfStamper.createSignature
    重载和
    boolean
    参数,并将该参数设置为
    true
    )如果您不想要我在回答中提到的少量不安全,您可以添加包含原始版本长度的文档元数据,因此,无论行的尾端是否是原始的一部分,都没有不安全的地方。我们总是使用createSignature(reader,signedPDF,“\0”,tempFile,true)签名。但只有签名才能创建pdf版本?或者还有其他更改会创建修订?@Sara“但只有签名才能创建pdf格式的修订?”-pdf不知道修订的明确概念。一些软件产品将修订的概念解释为PDF中的某些结构。最明显的这种结构是A有符号的修订版,因为有符号的字节范围意味着它的大小,B是当前的修订版,它只是整个文件。iText有用于提取A类修订的代码,而对于B类修订,无需执行任何操作即可提取。@Мааазачзазагаачзааа107。该调用提取签名字段签名所在的修订,而不是您似乎假设的添加之前的修订。