检查 x509 证书签名

问题描述 投票:0回答:1

我有:

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

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

c# .net x509
1个回答
5
投票

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