【问题标题】:Check signature for x509 certificate检查 x509 证书的签名
【发布时间】:2010-07-16 12:21:44
【问题描述】:

我有:

  1. x509 证书(Base64);
  2. 字符串数据;
  3. 字符串数据的签名 (Base64)。

是否可以检查签名?

我的代码:

  bool valid = false;

  var signature = Convert.FromBase64String(base64Signature);
  var data = Encoding.UTF8.GetBytes(stringData);

  var x509 = new X509Certificate2(Convert.FromBase64String(certificate));
  var dsa = x509.PublicKey.Key as DSACryptoServiceProvider;
  if (dsa!=null)
    valid = dsa.VerifySignature(data, signature);
  else {
    var rsa = x509.PublicKey.Key as RSACryptoServiceProvider;
    if (rsa!=null)
      valid = rsa.VerifyHash(data, ???, signature);
  }

我不知道应该用什么来代替???。可以从证书中获取哈希算法吗?

【问题讨论】:

  • 您能否说明您是要检查证书的签名(由其颁发者制作)还是使用与该证书对应的私钥制作的某些数据的签名?
  • 我想检查一些数据的签名(stringData)。

标签: c# .net x509


【解决方案1】:

原始消息的发送者可以使用他喜欢的任何算法来签署他的消息,使用与证书对应的私钥。虽然您可以从其 SignatureAlgorithm 属性中获取用于签署 证书 的算法的 OID,但没有什么能阻止发件人使用不同的签名或散列算法。

根据documentation,RSA 提供程序唯一有效的散列算法是 SHA1 和 MD5。也许您应该尝试使用这两种算法的 VerifyHash 并检查哪一种成功。您可以使用CryptoConfig.MapNameToOID 方法为每个人获取正确的 OID,如下所示:

string sha1Oid = CryptoConfig.MapNameToOID("SHA1");
string md5Oid = CryptoConfig.MapNameToOID("MD5");
bool sha1Valid = rsa.VerifyHash(data, sha1Oid, signature);
bool md5Valid = rsa.VerifyHash(data, md5Oid, signature);
valid = sha1Valid || md5Valid;

【讨论】:

  • 我猜你的意思是 CryptoConfig.MapNameToOID("MD5"); 第二行。
猜你喜欢
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2015-03-03
  • 1970-01-01
  • 2015-06-29
相关资源
最近更新 更多