检查x509证书的签名

我有:

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

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

原始消息的发送者可以使用他喜欢的任何算法来使用与证书相对应的私钥来签署他的消息。 虽然您可以从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;