代码之家  ›  专栏  ›  技术社区  ›  Marat Faskhiev

x509证书的检查签名

  •  4
  • Marat Faskhiev  · 技术社区  · 16 年前

    我有:

    1. x509证书(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 回复  |  直到 16 年前
        1
  •  4
  •   Panagiotis Kanavos    16 年前

    原始消息的发送者可以使用他喜欢的任何算法来对其消息签名,使用与证书相对应的私钥。而你可以得到用于签名的算法的OID 证明书 从SignatureAlgorithm属性来看,没有什么可以阻止发送方使用不同的签名或哈希算法。

    documentation ,RSA提供程序的唯一有效哈希算法是SHA1和MD5。也许您应该尝试验证这两种算法的哈希值,并检查哪一种算法成功。你可以使用 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;