如果没有2个哈希值相同,那么检查哈希值是如何工作的?

时间:2014-04-07 04:56:46

标签: hash passwords

我可能在这里错了,但据我所知,没有2个哈希是一样的。 当然,当我md5这个词"密码"两次,我得到两个不同的哈希。

如果用户的密码是"密码123",则哈希将类似于" 482c811da5d5b4bc6d497ffa98491e38"

如果用户在以后登录时输入密码,则密码123的散列为: " 286755fad04869ca523320acce0dc6a4"

如果两个哈希对于完全相同的单词不同,我如何比较它们?

2 个答案:

答案 0 :(得分:2)

使用相同算法的相同值的哈希总是相同的 - 这就是为什么可以比较哈希来验证值是否明确不同(如果哈希值相同,它仍然可能意味着值不同,但使用足够的话)像SHA256这样的长哈希可能足够安全,可以假设密码验证的值相同。)

最有可能的错误是让原始值以相同的方式表示(即非修剪空格,不同编码,......)并导致哈希值不同。

注意由于已知的弱点,MD5通常不能用于散列密码。

答案 1 :(得分:1)

请先阅读How to securely hash passwords?

我会在my answer to Password Verification - How to securely check if entered password is correct中留下大部分细节,但最重要的是:

  • 哈希是确定性的;但是,对于密码哈希,当用户选择密码时,会生成8-16字节的每用户随机盐
    • 并且使用用户的密码哈希,迭代/工作因子(见下文)以及您正在使用的密码哈希版本(以便您可以轻松更改)以明文形式保存盐
    • 因此在验证期间,您使用的是与之前相同的盐
  • 不应使用任何哈希函数的单次传递对密码进行哈希处理。
  • 密码应使用PBKDF2,BCrypt或SCrypt进行哈希处理。
    • 特别是对于PBKDF2,请勿选择大于本机散列大小的输出大小。
    • 在所有情况下,在预期的高峰时间内选择尽可能高的迭代次数。