微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用iText从PCKS7签名的PDF文件中获取哈希/摘要

如何解决使用iText从PCKS7签名的PDF文件中获取哈希/摘要

考虑到您需要摘要来满足某些 法律限制 ,因此,我假设您使用的是 *

如果要使用iText类(即 不是 安全提供程序类)来执行此操作,则必须克服一个小问题,即所要获取的值存储在私有成员(PdfPKCS7.digestAttr)中。不过,有些反射使您可以访问它:

void extractHashes(PdfReader reader) throws Exception
{
    AcroFields acroFields = reader.getAcroFields();
    List<String> names = acroFields.getSignatureNames();

    for (String name: names)
    {
        PdfPKCS7 pdfPkcs7 = acroFields.verifySignature(name);
        pdfPkcs7.verify();

        Field digestAttrField = PdfPKCS7.class.getDeclaredField("digestAttr");
        digestAttrField.setAccessible(true);
        byte[] digestAttr = (byte[]) digestAttrField.get(pdfPkcs7);

        // process the digest value in digestAttr 
    }
}

您可以找到更完整的示例ExtractHash.java中使用的方法,该示例输出最大算法和PDF文档中签名字段的摘要值,例如:

FirstPage11P0022AD_20150202164018_307494.pdf
  Signature1
    Digest algorithm: SHA1
    Hash: 4ac0ed7c2ec611d491f37b5ca74598237b85dbab

解决方法

我正在编写一个Java网络服务,该网络服务从网络中的某些客户端使用iText对PDF文档进行签名。文档已正确签名,可以使用外部工具进行验证。但是,由于某些法律限制,为了将此文档存储在正式的文档库中,我必须提供签名中的哈希/摘要消息。

我已经尝试了几乎所有方法来获取该哈希,但是我可以获取的最接近的方法是使用此代码段将整个签名(CERT + HASH / DIGEST +
TIMESTAMP)获取为字符串(原谅字符串和[1],因为我我只是在测试如何做):

    PdfReader reader = new PdfReader(path);
    File temp = TempFileManager.createTempFile("aasd2sd","asdasda222cff");
    PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(temp));
    stamper.setRotateContents(false);
    PdfString firma = (PdfString) stamper.getAcroFields().getSignatureDictionary("Signature1").get((PdfName)stamper.getAcroFields().getSignatureDictionary("Signature1").getKeys().toArray()[1]);

据我所知,有了它,我得到了DER编码的PKCS7签名。但是,我不知道如何解码/读取此信息以便赶快。

任何想法?

谢谢,克里斯。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。