当计算哈希值时,ComputeHash是否依赖于机器密钥?

5

我正试图确定使用以下代码进行哈希处理的值在机器密钥值不同的情况下是否会发生变化。此外,我想知道其他语言(如Java)中的实现是否会产生不同的结果。

string hashedPassword = Convert.ToBase64String(
    new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(
        System.Text.Encoding.Default.GetBytes(password)));

(我已经尝试在谷歌上寻找答案,但没有找到确切的结果。)

2个回答

15

SHA1CryptoServiceProvider.ComputeHash()会始终为相同的输入返回相同的结果(无论在哪台计算机上运行)。任何其他正确实现的SHA1算法也将给出相同的结果。

但请注意,您使用System.Text.Encoding.Default.GetBytes(password)来计算输入。这不会独立于计算机!您应该强烈考虑改用Encoding.UTF8


3
关于“编码(encodings)”的问题——如果有多台不同的机器向单个数据库贡献价值,那么这是一个相当常见的错误,也会造成很大混乱。 - poupou
+1 你的回答很棒,System.Text.Encoding.Default 是有问题的,你的回答让我节省了调试时间。 - Habib

1
不,答案是否定的。哈希算法不使用密钥,应该是实现独立的。在任何平台、任何机器密钥下,应该得到相同的输出。
顺便提一句,如果你想用来存储密码,你应该在哈希之前先对密码进行加盐(通常是随机添加若干字节),以防止字典攻击针对你的数据库。

感谢你的回答。只有一件事,你在回答中说“应该是实现独立的” - 它会有什么不同呢?或者文本应该是“将是实现独立的”? - jose
只要使用等效的代码,它将是独立于实现的。然而,.NET和Java的库在接口方面有很大不同,有时在移植代码时会出现错误。 - David M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接