.net - 为什么 SignHash 需要知道使用的是什么哈希算法?

标签 .net cryptography digital-signature

这可能是 http://crypto.stackexchange.com 的问题,但我想我会先在这里尝试,因为答案可能与 .NET 而不是加密算法本身有关。

RSACryptoServiceProvider class ,有一个方法SignHash , 哪一个:

Computes the signature for the specified hash value by encrypting it with the private key.



第一个参数是数据的哈希值(这看起来很公平),但第二个参数是一个字符串,说明用于创建哈希值的算法。

问题是为什么哈希算法很重要?当然,所有方法需要做的就是使用其私钥加密给定值并返回结果?如果它真的需要知道,为什么 RSACryptoServiceProvider 没有一个方法可以做到这一点(以及适当的验证方法)?

最佳答案

感谢 Iridium 让我在这里按照正确的思路思考。

收件人得到两件事:

  • 留言
  • 签名(由发送者的私钥加密)

  • 要验证消息,接收方需要使用发送方的公钥解密签名,并根据消息的哈希值进行检查。

    如果未向收件人指定哈希算法,则他们无法知道如何对消息进行哈希处理,因此他们无法对其进行验证。

    所以算法必须指定给接收者。

    为了让散列算法由发送者(谁知道签名是如何创建的)指定,并且不能被其他任何人修改,它需要包含在签名中,并与散列一起加密。

    因此,为了创建有用的签名,需要在加密散列时指定散列算法。

    关于.net - 为什么 SignHash 需要知道使用的是什么哈希算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843336/

    相关文章:

    Python 3 XChaCha20 测试向量可用于加密,但解密阶段失败

    java - iText7 LtvVerification.addVerification 未启用 LTV

    尽管小程序已正确签名,但仍发出 Java 警告

    .net - 如何确定当前用户是否通过 .NET 中的终端服务登录?

    C# - DataTable.Merge() 是否添加重复项或更新?

    java - 如何使用 AES 将字符串加密为仅包含特定字符的字符串?

    c - 从 EVP_CIPHER_CTX 或 EVP_CIPHER 获取 key 和 Iv 以及加密类型?

    java.security.cert.CertificateException : Unable to initialize

    c# - VS Code 无法在 Ubuntu 中找到 .Net 6 - 无法编译和运行应用程序

    .net - 如何在 Windows 10 上安装 OpenXML SDK 生产力工具 2.5