簡體   English   中英

檢查x509證書的簽名

[英]Check signature for x509 certificate

我有:

  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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM