6

我有:

  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);
  }

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

4

1 回答 1

5

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

根据文档,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;
于 2010-07-16T12:55:59.837 回答