一个密码如何与加盐哈希后的密码进行校验?

4
如果用户创建了一个新密码并通过哈希算法存储在数据库中,那么当他们登录时,可以将其与用户输入的密码进行匹配。登录屏幕输入的密码被哈希后检查是否与存储的哈希值匹配。如果匹配,则允许用户访问。
然而,现在的密码都经过哈希和盐处理。因此,当用户首次注册密码时,它会经过哈希处理,然后被盐处理超过10,000次。这个盐是由后端代码生成的相同关键字,还是每次都是随机生成的?
当用户输入密码登录时,如何将其与哈希和盐处理的密码匹配,如果盐每次都是随机的,那么肯定会得到不同的哈希值吧?这就是为什么即使两个用户输入相同的密码,最终也会得到不同的哈希值的原因。

2
盐通常与哈希/加盐密码一起存储。另外,你为什么要加盐10,000次? - DavidG
我正在使用 .NET Core 框架。它迭代了 10,000 次。 - GolfBravo
如果您正在使用ASP.NET Identity,则盐值存储在数据库中,但您实际上不需要担心这个问题,因为Identity会为您提供匹配密码的工具。 - DavidG
这更多是出于好奇。如果盐被存储在数据库中,黑客是否可以通过入侵数据库并进行暴力攻击,然后将哈希值匹配起来,就好像盐不存在一样,从而获取盐呢? - GolfBravo
这是关于让攻击者的生活变得更加困难。如果没有盐值,两个使用相同密码的人将拥有相同的哈希值。攻击者可以为整个数据库生成单个哈希表。有了盐值,每条记录都必须使用自己的哈希表。他们可能能够破解单个用户的密码,但不能破解所有用户的密码。 - DavidG
1个回答

3

很好的问题!

当用户首次注册密码时,它会经过哈希,然后被盐化10,000次。这个盐是由后端代码生成的相同关键字,还是每次都是随机生成的?

实际上,盐化和哈希单词的具体机制因实现而异。然而,盐的一般想法是为每个存储的密码生成一个随机的信息片段,称为盐。然后,存储的值是从密码本身的哈希与盐以某种方式混合得出的。可以是您对密码进行哈希,然后运行许多轮将哈希与盐组合,或者只是将密码和盐连接在一起并多次哈希。

为了使此过程正常工作,每个密码必须有不同的盐。如果每次使用相同的盐,那么完成哈希和盐混合后,所有相同密码的副本看起来都是一样的。这泄漏了信息,这是不好的。

当用户输入密码登录时,如果盐每次都是随机的,如何匹配哈希和盐化密码,它们最终会得到不同的哈希吗?

当服务器检查密码时,它需要访问存储密码时使用的盐。否则,它无法从密码重新计算存储的值。盐通常存储在最终哈希的旁边。想法是盐不是秘密 - 密码是 - 因此将其与密码一起存储就可以了。

这就是为什么即使两个用户输入相同的密码,它们最终得到的哈希也不同的原因。

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


很好的回答,尽管我一直在阅读这篇文章,但我无法找到他们将盐存储在数据库中的示例。https://www.makeuseof.com/nodejs-bcrypt-hash-verify-salt-password/ - Hairi

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