我有:
是否可以检查签名?
我的代码:
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);
}
我不知道应该用什么而不是???。可以从证书中获取哈希算法吗?
答案 0 :(得分:4)
原始邮件的发件人可以使用他喜欢的任何算法来使用与证书对应的私钥来签署其邮件。虽然您可以从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;