【问题标题】:Sign string with private key X509 certificate使用私钥 X509 证书签名字符串
【发布时间】:2018-07-19 05:24:19
【问题描述】:

我在当前用户存储 (Windows 10) 中有一个 X509 证书。在 C# / .NET 中验证 RSACryptoServiceProvider 生成的 JavaScript 签名的最简单方法是什么? 我已经有了 C# 方法:

public static string GetSign(string data, AsymmetricAlgorithm privateKey)
 {
            var rsa = (RSACryptoServiceProvider)privateKey;            
            TextWriter textWriter = new StringWriter();
            CertifycateKeyHelper.ExportPrivateKey(rsa, textWriter);
            RSACryptoServiceProvider rsaClear = new RSACryptoServiceProvider();
            rsaClear.ImportParameters(rsa.ExportParameters(true));
            var signature = rsaClear.SignData(Encoding.UTF8.GetBytes(data), 
               new SHA256CryptoServiceProvider());
            return BytesToHex(signature);
 }

另外,我该如何走另一个方向,生成一个 RSA SHA256 签名 javascript 并在 C# 中使用 RSACryptoServiceProvider 的实例对其进行验证?

【问题讨论】:

  • 要么找一个库,要么自己写一个(真的……真的……真的很痛苦)
  • 你不能。 RSA 和 SHA 是不同的加密哈希方案。它们不兼容。
  • 对于数字签名,我需要计算 SHA256 哈希并使用 RSA 对生成的哈希值进行签名。我错了吗?
  • 索要代码被认为是一个过于宽泛的问题。您需要进行研究并提出解决方案。
  • 既然你已经用 C# 弄明白了,为什么不写一个 Web 服务或 API 并从 JavaScript 发出一个方法调用呢?选项 B,节点 RSA,github.com/rzcoder/node-rsa

标签: javascript c# rsa digital-signature sha256


【解决方案1】:

首先,您需要一个库来解析 X.509 证书。然后,您需要一种方法来验证和验证证书或显式信任它(证书固定)。如果您不能信任证书和其中的公钥,那么验证签名是没有意义的;它不会让你信任用它签名的数据。

解析、验证和验证 X.509 证书并非易事,这意味着您离不开库。如果您可以固定证书,那么您只需从中检索公钥即可。您还可以使用不同的方法提取公钥并固定(即存储)公钥本身。

信任证书后,您可以从中提取公钥并执行签名验证。请注意,M$ 文档很烂,并且没有指定签名生成算法。它使用 PKCS#1 v1.5 填充。


对于签名生成,您需要以安全的方式传输私钥,解析私钥,然后执行签名生成。


StackOverflow 不是在这里为您完成工作,所以我只是提供了您需要遵循的步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2013-01-06
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多