【问题标题】:Why is SHA256 and invalid hash algorithm when signing with RSA?为什么使用 RSA 签名时使用 SHA256 和无效的哈希算法?
【发布时间】:2017-07-24 22:05:05
【问题描述】:

我正在尝试使用以下方法对流进行签名,但我总是收到一个加密异常,指出它不是有效的哈希算法,即使它已在文档中列出:

byte[] SignData(RSACryptoServiceProvider rsa, Stream stream, string hashName)
{
    HashAlgorithm hash = HashAlgorithm.Create(hashName);
    byte[] signature = rsa.SignData(stream, hash);
    return signature;
}

我用“SHA256”作为 hashName 参数来调用它。并且在调用 rsa.SignData() 的那一行抛出异常。

这不是使用 X509 证书,它不是重复的。顺便说一句,请参阅下面的答案。

【问题讨论】:

标签: rsa signing rsacryptoserviceprovider


【解决方案1】:

刚刚解决,不是重复的,因为我使用的是 .NET 的普通 RSACryptoServiceProvider 而不是 X509 证书。

我遇到了这个帖子: http://hintdesk.com/c-how-to-fix-invalid-algorithm-specified-when-signing-with-sha256/

读到它,我想到检查 RSA 签名算法,结果 URI 表明它是 SHA1,所以没有 SHA256 或 SHA512。然后我在 MSDN 文档中查找了该属性,它说该属性始终返回该值,因为它只支持该值,所以只有 SHA1

【讨论】:

    【解决方案2】:

    只有当 CSP ProviderType 值为 24 (PROV_RSA_AES) 且 ProviderName 为“Microsoft Enhanced RSA and AES Cryptographic Provider” (MS_ENH_RSA_AES_PROV) 时,软件支持的 RSACryptoServiceProvider 才能使用 SHA-2 摘要算法进行 RSA 签名。硬件可能需要也可能不需要 PROV_RSA_AES,这取决于硬件。

    RSACng 始终可以使用 SHA-2 摘要进行 RSA 签名(除非硬件支持并且硬件拒绝这样做,但这似乎不太可能),RSACng 也能够使用 SHA-2 进行 RSA OAEP 加密摘要(RSACryptoServiceProvider 仅具有 PKCS#1 v1.5 和 OAEP-SHA-1)和 RSA PSS 签名。

    但是RSACryptoServiceProvider 是唯一的内置 RSA 提供程序,直到 .NET Framework 4.6.2 才让整个框架满意地接受RSACng(在 4.6 中添加)。

    至于SignatureAlgorithm 属性,它被硬编码为SHA-1 XML 值。您无法从中提取任何信息。 (https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,e4a5c015070c0714)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2012-11-05
      • 2023-03-10
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多