【问题标题】:Verify signature with public key only (C#)仅使用公钥验证签名(C#)
【发布时间】:2019-08-11 10:08:31
【问题描述】:

我有两个应用程序。一个负责签署文件,另一个负责验证。

签名应用程序执行以下操作:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "cert.pfx", "password");

using (RSA rsa = certificate.GetRSAPrivateKey())
{
    signature = rsa.SignData(exeContent, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

cert.pfx 是自签名证书,由 Openssl 生成。

验证应用程序:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "cert.pfx", "password");

using (RSA rsa = certificate.GetRSAPublicKey())
{
    return rsa.VerifyData(exeContentWithoutSignature, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

据我了解,.pfx 文件包含公钥和私钥信息,因此我不应该将其提供给任何人。据我所知,验证步骤只需要公钥。 如何在不暴露我的 pfx 文件的情况下使用 rsa.VerifyData 或其他函数来验证签名?

【问题讨论】:

  • 您需要将它们放在两个单独的文件中,并且只公开公钥文件。
  • @LexLi 谢谢你的链接:)

标签: c# ssl rsa digital-signature public-key


【解决方案1】:

我已经有了可以通过这种方式生成的 .pfx 文件:

openssl req -x509 -days 365 -newkey rsa:2048 -keyout test-key.pem -out test-cert.pem
openssl pkcs12 -export -in test-cert.pem -inkey test-key.pem -out test-cert.pfx

为了提取仅包含公钥的证书,可以使用以下命令:

openssl pkcs12 -in test-cert.pfx -clcerts -nokeys -out cert.pem

-clcerts - 仅输出客户端证书。
-nokeys - 不输出私钥。

Cert.pem 可用于创建 X509Certificate2 的实例:

X509Certificate2 certificate = new X509Certificate2(PROJECT_DIR_PATH + "test-cert.pem");

using (RSA rsa = certificate.GetRSAPublicKey())
{
    return rsa.VerifyData(exeContentWithoutSignature, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
}

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多