【问题标题】:How to send public key only to verify digital signature如何仅发送公钥来验证数字签名
【发布时间】:2014-06-21 10:38:43
【问题描述】:

这不是一个 100% 的 c# 或 ASP.NET 问题,而是安全性和编程的混合体。所以我提前道歉。我需要将文件签名模块集成到我的 ASP.NET Web 应用程序中。我还需要编写一个实用程序来验证签名。我知道如何签署文件并验证它。以下是我的签名方式:

       private byte[] SignFile(byte[] fileData){
        X509Certificate2 cert=GetCertificate();
        RSACryptoServiceProvider csp = cert.PrivateKey;

        SHA1Managed sha1 = new SHA1Managed();
        byte[] hash = sha1.ComputeHash(fileData);
        return csp.SignData(hash, CryptoConfig.MapNameToOID("SHA1"));
      }

到目前为止一切顺利。另一方面,在验证时我需要公钥。所以这是我的问题。我是否需要将证书与签名文件一起发送,以便对方可以拿公钥来验证签名。如果是这样,这会带来另一个问题:其他人不能从附加证书中获取私钥来编辑文件并重新签名吗?这样做的正确方法是什么?

【问题讨论】:

    标签: asp.net ssl private-key


    【解决方案1】:

    要验证您使用公钥/私钥对创建的签名,对方只需要您的公钥。您应该始终保护您的私钥,永远不要让它泄露,否则恶意方可能会冒充您。

    使用X509Certificate2,您可以使用GetPublicKeyString 方法获取十六进制字符串并以文本格式将其传递给他们。您也可以简单地使用 Export 和 Import 方法仅交换公钥。

    PGP 的工作原理完全相同,但假设公钥是通过单独的受信任 渠道交换的(例如物理会议和交换 U 盘),以便接收者知道公钥是真的,不是假的。如果您使用来自 CA 的证书,那么 CA 签名链将暗示您对公钥的信任程度尽可能高。

    ExportImport 的代码示例:

    var cspSig = (RSACryptoServiceProvider)cert.PrivateKey;
    var sig = cspSig.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    var pubKeyBytes = cert.Export(X509ContentType.Cert);
    // either send the client the bytes, or the cert file ...
    File.WriteAllBytes("MyCert.cer", pubKeyBytes);
    

    在客户端...

    var pubCert = new X509Certificate2();
    pubCert.Import(pubKeyBytes);
    var cspVer = (RSACryptoServiceProvider)pubCert.PublicKey.Key;
    var isValid = cspVer.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sig);
    var hasPrivateKey = pubCert.HasPrivateKey; // will equal false if using .Export(X509ContentType.Cert)
    

    【讨论】:

    • 好的,这就是重点:公钥以什么形式提供?在证书内还是作为某种数据?
    • 如果您使用ExportImport,那么您将其导出为证书文件的字节。如何将其传输给客户取决于您。上面的代码示例。
    • 在这种情况下,客户端也可以看到私钥。即使是中间人,var cspVer = (RSACryptoServiceProvider)pubCert.Privatekey;
    • @Vijay 我几乎可以肯定情况并非如此。这个答案已有多年历史,但 iirc cert.Export(X509ContentType.Cert) 仅导出公钥,而不导出私钥。另见this answer
    猜你喜欢
    • 2017-02-18
    • 2013-08-17
    • 2019-08-11
    • 2013-05-28
    • 2022-07-25
    • 2023-04-06
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多