2010-07-16 272 views
4

檢查簽名,我有:爲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); 
    } 

我不知道我應該用什麼來代替???。從證書中獲取哈希算法是可能的?

+0

你能澄清是否要檢查證書的簽名(其發行人製造)或某些數據的簽名,與製作該證書對應的私鑰? – Bruno 2010-07-16 12:32:43

+0

我想檢查一些數據的簽名(stringData)。 – 2010-07-16 12:33:30

回答

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; 
+0

我想你的意思是'CryptoConfig.MapNameToOID(「MD5」);'爲第二行。 – Bruno 2010-07-16 13:39:03

+0

謝謝。一些評論:我必須使用VerifyData。 – 2010-07-19 09:25:40