我使用nitro pro 10/11编辑签名的PDF文档。
Adobe Reader可以识别文档内容已被修改,但iText(V5.5.6 / V7.0.2)可以完整性检查。
如何使用iText检查完整性是否正确?
答案 0 :(得分:0)
iText提供了一个API来验证每个集成签名,并检查它是否涵盖整个文档。但是,它不会检查是否允许更改增量更新。
PDF可以通过称为增量更新的机制进行更改。此机制仅附加到文件,保持原始字节不变。每次这样的增量更新都会将新文件版本添加到文件中。
集成的PDF签名签署了文档的完整修订版本,并将其添加到文件中,但实际签名字节明显例外。
因此,即使后面的版本完全改变了PDF的显示方式,前一版本的签名仍然可以正确地标记其字节范围。
与常见的签名用例一样,签名的内容不应随意更改,PDF规范仅考虑签名修订的增量更新中的极少数类型的更改,参见堆栈溢出this answer以及从那里引用的文档。
iText提供了一个API来验证每个集成签名,特别是此验证检查集成签名是否正确地标记了它应用的字节。
iText还确定签名是否涵盖整个文件,即文件的最新版本。
iText 不提供简单的API函数,用于检查是否允许对签名修订的增量更新中的更改。
这个任务实际上非常重要,因为没有详细说明允许的更改;我不知道有任何适当的开源实现。即使是用于此检查的代码中的Adobe Reader也存在许多错误否定,其中允许的更改的实现方式与Adobe Reader本身所做的不同,例如,见this answer。
但是,iText确实提供了实现此类测试的低级工具,因此欢迎任何人在iText之上实现它们。您可以使用iText 5.5.10执行检查:
PdfReader reader = new PdfReader(resource);
AcroFields acroFields = reader.getAcroFields();
List<String> names = acroFields.getSignatureNames();
for (String name : names) {
System.out.println("Signature name: " + name);
System.out.println("Signature covers whole document: " + acroFields.signatureCoversWholeDocument(name));
System.out.println("Document revision: " + acroFields.getRevision(name) + " of " + acroFields.getTotalRevisions());
PdfPKCS7 pk = acroFields.verifySignature(name);
System.out.println("Subject: " + CertificateInfo.getSubjectFields(pk.getSigningCertificate()));
System.out.println("Document verifies: " + pk.verify());
}
(VerifySignature test testVerifyBabyloveSigned
)
OP示例文件的输出为:
babylove_signed.pdf =================== Signature name: Fadadaf1a333d3-d51a-4fbb-ad22-bbdcaddd7d8e Signature covers whole document: true Document revision: 1 of 1 Subject: {C=[CN], OU=[fabigbig, Individual-1], CN=[051@???@352229198405072013@2], O=[CFCA OCA1]} Document verifies: true babylove_signed&modify_by_nitro.pdf =================== Signature name: Fadadaf1a333d3-d51a-4fbb-ad22-bbdcaddd7d8e Signature covers whole document: false Document revision: 1 of 2 Subject: {C=[CN], OU=[fabigbig, Individual-1], CN=[051@???@352229198405072013@2], O=[CFCA OCA1]} Document verifies: true
如您所见,signed.pdf
只有一个修订版,其集成签名有效,它涵盖整个文件。 signed&modify_by_nitro.pdf
有两个修订版,其集成签名有效,但仅涵盖修订版。
因此,iText表示虽然后一个文件中的签名确实正确签署了其修订版,但第二版中可能会有任何更改。