在创建一个openPDF时,我在docMDP中无意中看到了以下代码:
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‘看起来相当静态,诚实地说,就像一个虚拟的实现。对这些价值观有什么见解吗?为什么他们可以在没有后果的情况下改变?我把它和它的前身作了比较,但是它和它一样.
发布于 2021-09-06 08:19:09
您的问题本质上不是关于OpenPDF,而是关于DocMDP转换字典中的某些值。因此,我的回答不会集中在OpenPDF上。
在PDF版本1.5和1.6中,除了Byte范围摘要外,还使用了所谓的对象摘要和转换方法的签名。这些摘要是在某一组PDF对象上递归计算的,具体取决于所述转换的类型和参数。
DigestMethod值是在对象摘要中使用的哈希算法。
在Adobe的PDF引用中,1.7对象摘要被否决了,这在勘误表中得到了明确的说明:

在ISO 32000-1中,对象摘要被从文本中完全删除(在某些情况下,留下的文本很难理解)。
因此,您想知道的值被废弃,不再用于验证目的。
您还可以找到iText在相同的勘误表中使用虚拟值的原因:

因此,Acrobat 7和8需要一些值。如今,他们已经没有必要了。
在这种情况下,您可能会对PDF第117期感兴趣-- DigestMethod错误地成为了ISO 32000-2:2020中的要求,这个问题是关于反对它的。
发布于 2021-09-06 15:21:57
因此,在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阅读器的抱怨..。
https://stackoverflow.com/questions/69047874
复制相似问题