如何根据散列和加盐密码检查密码?

How is a password checked against a hashed and salted password?

如果用户创建了一个新密码并通过哈希算法存储在数据库中,然后可以在用户登录时将其与用户输入的密码进行匹配。在登录屏幕中输入的密码是哈希,然后检查它是否与存储的哈希匹配。如果是,则允许用户访问。

然而,如今,密码经过哈希处理和加盐处理。因此,当用户首次注册他们的密码时,它会经过一个散列,然后经过 10,000 多次加盐处理。这个盐是由后端代码生成的具有相同关键字的盐,还是每次盐腌时随机生成?

当用户输入密码登录时,它是如何匹配哈希和加盐密码的,如果每次加盐都是随机的,那么最终肯定会得到不同的哈希值?这就是为什么即使两个用户输入相同的密码,他们最终也会得到不同的哈希值。

好问题!

So when the user first registers their password, it goes through a hash, and then it gets salted over 10,000 times. Is this salt with the same keyword generated by the backend code, or is it randomly generated for each time it gets salted?

加盐和散列词的实际机制因实施而异。然而,salt 背后的一般思想是为每个存储的密码生成一条随机信息,称为 salt。存储的值然后从密码本身的散列中导出,并以某种方式与盐混合。可能是您对密码进行哈希处理,然后 运行 将哈希与 salt 结合很多轮,或者您可能只是将密码和 salt 连接在一起并对其进行多次哈希处理。

要使此过程正常运行,您必须为每个密码设置不同的加盐值。如果您每次都使用相同的盐,那么在您完成散列并将其与盐组合后,相同密码的每个副本看起来都是一样的。这会泄露信息,这可不是什么好事。

When the user enters the password to log in, how does it match up to the hash and salted password, if the salt is random each time, surely it will end up with a different hash?

当服务器检查密码时,它需要访问它在存储密码时使用的盐。否则,它无法根据密码重新计算存储的值。盐通常存储在最终哈希旁边。这个想法是盐不是秘密——密码才是——所以把它放在一起就好了。

That's why even if two users entered the same password, they end up with a different hashes.

是的,每个密码都用不同的盐存储。每个盐都是随机生成的,然后与最终密码哈希一起存储。