安全用户认证是如何工作的?

3
当用户注册时,我会使用哈希和盐对其密码进行保护,然后将其存储到mysql数据库中。那么当已注册用户尝试登录时,我如何检查密码是否有效?
我唯一想到的方法是获取他们的密码,对哈希+盐进行处理,然后检查哈希+盐是否在数据库中。但我不确定这样做是否安全?因为这意味着我的代码将对任何密码进行哈希+盐,并在数据库中找到匹配项。
我了解到每次访问登录页面时生成随机盐,但这是否意味着如果已注册用户尝试登录,则会生成一个新的哈希值,该哈希值与同一用户注册时生成的哈希值不同。
我希望有人能够解答这个问题。我正在使用Java。

"因为这意味着我的代码将对任何密码进行哈希加盐并在数据库中找到匹配项。" > 你能解释一下你的意思吗? - Duncan Jones
2个回答

2
基本上,您需要将h(password+salt)salt存储在数据库中。如果某个用户尝试登录,则会获取其明文密码。然后从数据库中获取用户的盐值,在生成password+salt的哈希值后,如果与存储的哈希值相同,则认证成功。
这比基本散列密码更安全,因为它使来自哈希的大规模暴力破解变得更加困难,因为攻击者必须猜测盐和实际密码。但是,如果盐是公开的(或已知于攻击者),这并不会使单个密码的暴力破解更加困难。它还使彩虹表无用,这是常见密码的巨大预生成哈希列表。
要获得更深入的解释,请参见此处此处

谢谢。那么我将使用用户的用户名从数据库中获取存储的盐?这是否意味着如果有人知道我的用户名,他们可以从数据库中检索我的盐并对其进行哈希+盐,并将其与存储的哈希进行比较?这仍然安全吗? - webDeveloper
如果某人可以自由访问数据库和哈希表,那么是的。但这是一个非常糟糕的想法。 - Simiil

0
在我的情况下,我将哈希(盐+密码)和盐存储在数据库中。当用户提供登录和密码时,我获取盐并添加到提供的密码中,然后进行哈希比较与数据库中存储的哈希密码。如果相等/正确,我会重新生成一个新的盐,并将其添加到正确的密码中,然后进行哈希并存储。

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