检查 PDFBox v2.x.x 签名后是否更改了 PDF 表单
Check with PDFBox v2.x.x if a PDF Form was changed after signing
我有一个 pdf 表格。如果在添加签名后更改了 pdf 表单,如何使用 PDFBox v2.x.x 检查?我认为 itext 4.2.1 中的等价物是 signaturecoverswholedocument 方法。我唯一能找到的是如何检查签名本身:
if (signerInformation.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificateHolder))) {
没有完美答案,只有做决定的策略:
try (PDDocument document = PDDocument.load(new File(infile), password))
{
for (PDSignature sig : document.getSignatureDictionaries())
{
int[] byteRange = sig.getByteRange();
System.out.println("byteRange: " + Arrays.toString(byteRange));
System.out.println("Range max: " + (byteRange[byteRange.length-2] + byteRange[byteRange.length-1]));
// multiply content length with 2 (because it is in hex in the PDF) and add 2 for < and >
System.out.println("Content len: " + (sig.getCOSObject().getString(COSName.CONTENTS).length() * 2 + 2));
System.out.println("File len: " + new File(infile).length());
(...)
现在用 this file 测试一下。你会得到这个输出:
byteRange: [0, 192, 10094, 162062]
Range max: 172156
Content len: 9902
File len: 172156
签名的数据从 0 开始,长度为 192,然后是签名,然后是 10094 处的其余数据,长度为 162062。您会注意到 10094 + 162062 == 172156,而 192 + 9902 = = 10094.
当然如果有多个签名就不会那么完美了。
我有一个 pdf 表格。如果在添加签名后更改了 pdf 表单,如何使用 PDFBox v2.x.x 检查?我认为 itext 4.2.1 中的等价物是 signaturecoverswholedocument 方法。我唯一能找到的是如何检查签名本身:
if (signerInformation.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificateHolder))) {
没有完美答案,只有做决定的策略:
try (PDDocument document = PDDocument.load(new File(infile), password))
{
for (PDSignature sig : document.getSignatureDictionaries())
{
int[] byteRange = sig.getByteRange();
System.out.println("byteRange: " + Arrays.toString(byteRange));
System.out.println("Range max: " + (byteRange[byteRange.length-2] + byteRange[byteRange.length-1]));
// multiply content length with 2 (because it is in hex in the PDF) and add 2 for < and >
System.out.println("Content len: " + (sig.getCOSObject().getString(COSName.CONTENTS).length() * 2 + 2));
System.out.println("File len: " + new File(infile).length());
(...)
现在用 this file 测试一下。你会得到这个输出:
byteRange: [0, 192, 10094, 162062]
Range max: 172156
Content len: 9902
File len: 172156
签名的数据从 0 开始,长度为 192,然后是签名,然后是 10094 处的其余数据,长度为 162062。您会注意到 10094 + 162062 == 172156,而 192 + 9902 = = 10094.
当然如果有多个签名就不会那么完美了。