1

在创建 docMDP 时,我在 openPDF 中偶然发现了以下代码:

private void addDocMDP(PdfDictionary crypto) {
    PdfDictionary reference = new PdfDictionary();
    PdfDictionary transformParams = new PdfDictionary();
    transformParams.put(PdfName.P, new PdfNumber(certificationLevel));
    transformParams.put(PdfName.V, new PdfName("1.2"));
    transformParams.put(PdfName.TYPE, PdfName.TRANSFORMPARAMS);
    reference.put(PdfName.TRANSFORMMETHOD, PdfName.DOCMDP);
    reference.put(PdfName.TYPE, PdfName.SIGREF);
    reference.put(PdfName.TRANSFORMPARAMS, transformParams);
    reference.put(new PdfName("DigestValue"), new PdfString("aa"));
    PdfArray loc = new PdfArray();
    loc.add(new PdfNumber(0));
    loc.add(new PdfNumber(0));
    reference.put(new PdfName("DigestLocation"), loc);
    reference.put(new PdfName("DigestMethod"), new PdfName("MD5"));
    reference.put(PdfName.DATA, writer.reader.getTrailer().get(PdfName.ROOT));
    PdfArray types = new PdfArray();
    types.add(reference);
    crypto.put(PdfName.REFERENCE, types);
  }

这也将被放入 PDF:

/Reference[<</DigestLocation[0 0] /TransformMethod/DocMDP /Type/SigRef /DigestMethod/MD5  
/DigestValue(aa) /TransformParams<</P 1/V/1.2/Type/TransformParams>>/Data 5 0 R>>]

我将 DigestMethod 更改为更新的方法,它确实有效。此外,'aa' 看起来非常静态,老实说就像一个虚拟实现。关于这些价值观的任何见解?为什么可以毫无后果地改变它们?我将它与它的前身 *text 5 进行了比较,但它在那里是一样的......

4

2 回答 2

1

您的问题本质上不是关于 OpenPDF,而是关于DocMDP转换字典中的某些值。因此,我的回答不会集中在 OpenPDF 上。

在 PDF 版本 1.5 和 1.6 中,除了带有转换方法的签名中的字节范围摘要之外,还使用了所谓的对象摘要。这些摘要是在特定的 PDF 对象集上递归计算的,具体取决于相关转换的类型和参数。

DigestMethod值是在对象摘要中使用的哈希算法。

在 Adob​​e 的 PDF 参考 1.7 中,对象摘要已被弃用,勘误表中非常清楚地说明了这一点:

勘误表截图

在 ISO 32000-1 中,对象摘要从文本中完全删除(在某些情况下留下难以理解的文本)。

因此,您想知道的值已被弃用,不再用于验证目的。

您还可以找到 iText 在同一个勘误表中使用虚拟值的原因:

截屏

因此,Adobe Acrobat 7 和 8 需要一些值。现在已经不需要它们了。


在这种情况下,您可能对PDF 问题 117感兴趣- ISO 32000-2:2020错误地要求DigestMethod并且这个问题是关于弃用它。

于 2021-09-06T08:19:09.323 回答
0

因此,在 openPDF 中,我们可以像这样调整方法:

private void addDocMDP(PdfDictionary crypto) {
    PdfDictionary reference = new PdfDictionary();
    PdfDictionary transformParams = new PdfDictionary();
    transformParams.put(PdfName.P, new PdfNumber(certificationLevel));
    transformParams.put(PdfName.V, new PdfName("1.2"));
    transformParams.put(PdfName.TYPE, PdfName.TRANSFORMPARAMS);
    reference.put(PdfName.TRANSFORMMETHOD, PdfName.DOCMDP);
    reference.put(PdfName.TYPE, PdfName.SIGREF);
    reference.put(PdfName.TRANSFORMPARAMS, transformParams);
    reference.put(PdfName.DATA, writer.reader.getTrailer().get(PdfName.ROOT));
    PdfArray types = new PdfArray();
    types.add(reference);
    crypto.put(PdfName.REFERENCE, types);
}

我尝试并测试了它,* dobe 阅读器没有任何抱怨......

于 2021-09-06T15:21:57.797 回答