【问题标题】:C# Verifying PDF signatureC# 验证 PDF 签名
【发布时间】:2017-10-22 04:56:14
【问题描述】:

尝试验证 PDF 签名不起作用。 PDF 由 Adob​​e Acrobat 签名,然后尝试使用客户端证书的公钥对其进行验证。

所以我得到了客户端证书的公钥,对 PDF 进行哈希处理并验证哈希是否等于 pdf 签名,但它失败了。

HttpClientCertificate cert = request.ClientCertificate;
X509Certificate2 cert2 = new X509Certificate2(cert.Certificate);

PdfReader pdfreader = new PdfReader("path_to_file");

AcroFields fields = pdfreader.AcroFields;
AcroFields.Item item = fields.GetFieldItem("Signature1");
List<string> names = fields.GetSignatureNames();

foreach (string name in names){
     PdfDictionary dict = fields.GetSignatureDictionary(name);
     PdfPKCS7 pkcs7 = fields.VerifySignature(name);
     Org.BouncyCastle.X509.X509Certificate pdfSign = pkcs7.SigningCertificate;

     // Get its associated CSP and public key
     RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert2.PublicKey.Key;

     // Hash the data
     SHA256 sha256 = new SHA256Managed();

     byte[] pdfBytes = System.IO.File.ReadAllBytes("path_to_pdf");
     byte[] hash = sha256.ComputeHash(pdfBytes);

     // Verify the signature with the hash
     bool ok = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA256"), pdfSing.GetSignature());
 }

【问题讨论】:

    标签: c# pdf itext rsa digital-signature


    【解决方案1】:

    首先,要验证签名是否正确,您可以简单地使用您已经检索到的PdfPKCS7 对象,更准确地说是它的Verify 方法:

    /**
     * Verify the digest.
     * @throws SignatureException on error
     * @return <CODE>true</CODE> if the signature checks out, <CODE>false</CODE> otherwise
     */
    virtual public bool Verify()
    

    因此,您可以简单地调用

    bool ok = pkcs7.Verify();
    

    只有当文档哈希与签名中的哈希匹配时,ok 才是 true


    关于您尝试像这样计算文档哈希

    byte[] pdfBytes = System.IO.File.ReadAllBytes("path_to_pdf");
    byte[] hash = sha256.ComputeHash(pdfBytes);
    

    这确实为您提供了完整 PDF 的哈希值。

    但是,对于像 PDF 这样具有集成签名的文档类型,这不是感兴趣的哈希值,因为完整的 PDF 显然包含集成签名!

    因此,您必须在 PDF 中找到为签名保留的空间,并在哈希计算期间忽略它,参见。 this answer 在信息安全堆栈交换上,特别是这张图片:

    如果有多个签名,您还必须考虑到较早的签名仅签署 PDF 的先前版本,因此仅针对文件的起始段计算哈希,参见。此图来自answer referenced above

    iText(Sharp) 方法PdfPKCS7.Verify() 将所有这些都考虑在内。

    【讨论】:

    • 优秀的答案!谢谢
    • @mkl 你知道我们如何获得除签名值之外的 pdf 字节吗?这样我们就可以从签名的 pdf 中重新计算哈希值?
    • @emrenevayeshirazi 您可以简单地采用 iText AcroFields 类中的代码,看看它的verifySignature 方法和它调用的updateByteRange 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2011-08-18
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多