【问题标题】:Check with PDFBox v2.x.x if a PDF Form was changed after signing检查 PDFBox v2.x.x 是否在签名后更改了 PDF 表单
【发布时间】:2017-10-15 12:27:31
【问题描述】:

我有一个 pdf 表格。如果在添加签名后更改了 pdf 表单,如何使用 PDFBox v2.x.x 检查?我认为 itext 4.2.1 中的等价物是 signaturecoverwholedocument 方法。我唯一能找到的是如何检查签名本身:

        if (signerInformation.verify(new JcaSimpleSignerInfoVerifierBuilder().build(certificateHolder))) {

【问题讨论】:

  • iText Software 从未发布过 iText 4.2.1。
  • 我没有完美的答案,只有一个提示:在 PDSignature 对象上调用 getByteRange()(在 PDF 规范中阅读值的含义),然后将这些值与大小进行比较您的 PDF。
  • @Tilman 应该足以作为实际答案......

标签: java pdf itext digital-signature pdfbox


【解决方案1】:

没有完美的答案,而是做出决定的策略:

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 .

当然,如果有多个签名,它看起来就不会那么完美。

【讨论】:

  • 这基本上就是OP提到的iText signaturecoverswholedocument方法所做的。
  • @mkl 是的,我刚刚看到你对stackoverflow.com/questions/37490084/… 的回答。也许我会将我的解决方案添加到 ShowSignature 示例中,并警告说错误的结果并不一定意味着 PDF 是假的。
  • 它有效。是否也可以使用来自 signatureDictionary 的证书解密存储在签名中的(任何)摘要,从实际 pdffile(在字节范围内)计算摘要并将该摘要与解密的摘要进行比较?
  • 我认为这是源代码下载的 ShowSignature 示例中所做的。
猜你喜欢
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 2011-02-20
  • 2022-07-16
  • 1970-01-01
相关资源
最近更新 更多