首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用docMDP添加证书/ openPDF签名

使用docMDP添加证书/ openPDF签名
EN

Stack Overflow用户
提问于 2021-09-03 16:11:05
回答 2查看 276关注 0票数 1

在创建一个openPDF时,我在docMDP中无意中看到了以下代码:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
/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‘看起来相当静态,诚实地说,就像一个虚拟的实现。对这些价值观有什么见解吗?为什么他们可以在没有后果的情况下改变?我把它和它的前身作了比较,但是它和它一样.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中的要求,这个问题是关于反对它的。

票数 1
EN

Stack Overflow用户

发布于 2021-09-06 15:21:57

因此,在openPDF中,我们可以采用这样的方法:

代码语言:javascript
复制
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阅读器的抱怨..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69047874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档