C#中的SHA1哈希值是否会永远返回给定字符串的相同值?

时间:2011-07-23 04:35:58

标签: c# hash sha1

我正在考虑改变我们加密密码的方法,使用单向哈希而不是加密。我考虑在密码字符串上使用简单的“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);

这个值总是会永远是同样的结果吗?我并不太担心这个大空间的碰撞,但还有其他理由考虑更广泛的哈希吗?提前谢谢!

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

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

对于您的信息,SHA1不是散列密码的好方法,尽管它肯定是对可逆加密的重大改进。与MD5一样,SHA1设计用于非常快速地散列大量数据,因此非常适合强制密码破解。密码的最佳散列函数设计为(相对)慢或速度可调,并且很难用硬件加速。构建在.NET框架中的是PBKDF2,它基本上实现了“拉伸”SHA1(将SHA1反复应用于同一输入以便花费更长时间。)它在this framework class.中实现