使用iText7签名的PDF / A允许更改附件文档而不会破坏签名

时间:2018-09-20 07:35:45

标签: signing itext7 pdfa

我已经使用iText7创建了PDF / A文档。创建的文档带有附件()。附件是一个.csv文件。然后整个PDF / A已签名。我打开了附件.csv文件,并在签名后对其进行了更改。我已经使用以下代码来验证签名:

  public PdfPKCS7 verifySignature(SignatureUtil util, String name) throws GeneralSecurityException, IOException {
    System.out.println("Signature covers whole document: " + util.signatureCoversWholeDocument(name));
    System.out.println("Document revision: " + util.getRevision(name) + " of " + util.getTotalRevisions());
    PdfPKCS7 pkcs7 = util.verifySignature(name);
    System.out.println("Integrity check OK? " + pkcs7.verify());
    return pkcs7;
}

我原本希望完整性检查返回错误,但是我得到了:

 Signature covers whole document: false
 Document revision: 1 of 2
 Integrity check OK? true

这是否是iText的预期行为,是否误解了签名的意图?我希望整个文档都可以锁定以进行更改(如果允许的话,可以填写表格或注释)。

如果我要禁止更改附件,用附件对PDF进行签名的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

要了解此处发生的情况,您必须知道有多种方法将更改保存到PDF:

  • 您可以简单地像处理新文档一样保存经过处理的PDF。这样做通常会更改已签名的字节,从而使您运行的完整性检查失败。

  • 或者您可以将更改添加为所谓的增量更新,即将其附加到PDF。这样做不会更改有符号的字节范围,从而使您成功执行完整性检查

在您的情况下,已使用增量更新保存了修改。这不会更改带符号的字节。因此,完整性检查将成功,因为它仅检查签名是否仍正确地对原始签名的字节范围进行签名。

另一方面,覆盖率检查(您的signatureCoversWholeDocument呼叫)会通知您所涉及的签名不再涵盖整个文档。因此,您知道更改已作为增量更新附加。

不幸的是,iText尚未提供高级API来确定增量更新引入的更改的性质(不过,iText低级API可以用作实现此类API的基础)。

对于集成PDF签名的某些背景,您可能需要阅读this answer和从那里引用的文档。

  

我希望整个文档都将被锁定以进行更改(如果允许的话,除了填写表格或注释外)。

从技术上讲,您可以在增量更新中添加任何类型的更改。增量更新不仅用于存储对签名文档的允许更改,还可以在没有签名的情况下使用,例如可以将修订历史记录保留在PDF中,或者(单独保存)以允许在WORM设备上有效地存储PDF编辑内容。

因此,要确定是否允许对PDF进行更改,验证程序必须分析增量更新中的添加内容。