我有:
可以检查签名吗?
我的代码:
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 属性获取用于签署 certificate 的算法的 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;