【问题标题】:Will a SHA1 Hash in C# always and forever return the same value for a given string?C# 中的 SHA1 哈希是否会始终为给定字符串返回相同的值?
【发布时间】:2011-07-23 04:35:57
【问题描述】:

我正在考虑更改加密密码的方法,以使用单向哈希而不是加密。我考虑在密码字符串上使用一个简单的“GetHashCode”,但 MS 警告说这个函数将来可能会改变,并且在 32 位和 64 位操作系统上是不同的。我不希望结果永远不同,因为这会导致数据库中的所有密码在我输入值时不再匹配(例如,当我们都迁移到 .NET 9.0 或其他东西时)。

那么,SHA1 哈希是否可以消除这个问题?例如,如果我使用这个 C# 代码:

        var data = System.Text.Encoding.ASCII.GetBytes(value);
        data = System.Security.Cryptography.SHA1.Create().ComputeHash(data);
        return Convert.ToBase64String(data);

值会永远是相同的结果吗?我不太担心在这么大的空间中发生碰撞,但还有其他理由考虑更广泛的散列吗?提前致谢!

【问题讨论】:

  • 是的 sha1 md5 将保持不变......虽然 sha1 和 sha2 会有所不同,但这就是它们存在的主要原因!!
  • 我建议你切换到 UTF8 编码,因为 ASCII 迟早会让你不开心。 ASCII 也应该死。

标签: c# hash sha1


【解决方案1】:

是的。

与GetHashCode不同,SHA-1是固定算法,就像MD5和SHA-256一样, 所有这些都已“标准化”。

【讨论】:

  • 虽然我想 2 个不同的字符串可能有相同的哈希值。看起来很合理,不是吗?
  • @Esteban:是的,这是信息论的基本原理之一。有无数个字符串,但只有 2^256 个 256 位数字,所以 必须 重复。哈希结果越大,找到具有相同哈希码的两个字符串的机会就越低。
  • @Esteban,是的,但是在你中了彩票后你更有可能被公共汽车撞到(显然夸大了),尤其是使用 sha512 或 sha2
  • @Jesus:实际上,这一点也不夸张。中彩票后被公交车撞到的几率只有二分之一到60左右。与 256 位加密散列随机发生散列冲突的几率大约是 1 万亿 万亿 万亿 万亿 万亿 万亿 次小于。 (如果您故意寻找碰撞——哈希碰撞或总线碰撞——几率当然完全不同。)
  • 谢谢@Peter。我根本不担心冲突,因为这是数据库中已经高度安全的基本密码哈希。客户只是想确保他们输入的密码不会被我们这边的任何人读取,以防万一他们在其他地方使用相同的密码。
【解决方案2】:

是的。 SHA1 是一个标准,C# 实现必须符合标准并产生相同的结果。

请注意,SHA1 并不是一种很好的密码散列方法,尽管它肯定是对可逆加密的一大改进。 SHA1 与 MD5 一样,旨在非常快速地散列大量数据,因此非常适合暴力破解密码。密码的最佳散列函数设计为(相对)慢或具有可调节的速度,并且难以通过硬件加速。 .NET 框架中内置的一个是 PBKDF2,它本质上实现了“拉伸”SHA1(将 SHA1 反复应用于相同的输入,因此需要更长的时间。)它在 this framework class.

中实现

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2011-01-28
    • 2013-08-18
    • 2011-11-12
    相关资源
    最近更新 更多