Проверьте подпись для сертификата x509 - PullRequest
4 голосов
/ 16 июля 2010

у меня есть:

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

Я не знаю, что мне следует использовать вместо ??? Можно ли получить хеш-алгоритм из сертификата?

1 Ответ

4 голосов
/ 16 июля 2010

Отправитель исходного сообщения может использовать любой алгоритм, который ему нравится, для подписания своего сообщения, используя закрытый ключ, соответствующий сертификату.Хотя вы можете получить OID алгоритма, используемого для подписи сертификата , из его свойства SignatureAlgorithm, ничто не мешает отправителю использовать другой алгоритм подписывания или хеширования.* документация , единственными действительными алгоритмами хеширования для провайдера 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;
...