2010-07-16 3 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

+0

Я хочу проверить сигнатуру некоторых данных (stringData). –

ответ

4

Отправитель оригинального сообщения может использовать любой алгоритм, который ему нравится подписывать своим сообщением, используя закрытый ключ, соответствующий сертификату. Хотя вы можете получить OID алгоритма, используемого для подписи сертификата из его свойства SignatureAlgorithm, ничто не мешает отправителю использовать другой алгоритм подписи или хэширования.

Согласно documentation, единственными допустимыми алгоритмами хэширования для поставщика RSA являются SHA1 и MD5. Возможно, вам следует попробовать VerifyHash с обоими алгоритмами и проверить, какой из них преуспевает. Вы можете получить надлежащий OID для каждого из них с помощью метода CryptoConfig.MapNameToOID так:

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

+0

Спасибо. Некоторое замечание: я должен использовать VerifyData. –

Смежные вопросы