6

我正在用Java
开发一个 Web 应用程序,我想 通过使用散列密码 来确保身份验证过程的安全。

在散列
步骤 1 中:我们获取用户提供的密码并为其添加
第2步:使用MessageDigest哈希值并将哈希值存储在数据库中

在登录过程中对用户进行身份验证时,我们重复上述两个相同的步骤,但我们不
存储散列值,而是将其与数据库中存在的值进行比较。

现在原谅我的无知,但我想说的是,如果黑客通过任何其他
方式访问数据库,那么它可以提供安全性,因为黑客无法从哈希
值中轻松获取密码的真实文本。

但是Bruteforce attack, Rainbow attack, dictionary attack,当我们使用相同的步骤对用户进行登录身份验证 时,它如何提供针对其他形式的攻击的安全性?

我不认为现在密码的散列值那么多。
给我一些建议......如果我错了。

4

4 回答 4

4

蛮力就是蛮力。除了在 N 次连续失败的试验后拒绝尝试身份验证(或施加延迟)之外,您无能为力。当然,如果黑客拥有散列密码,他将能够暴力破解密码,但安全散列函数的重点是让它变得非常长。

彩虹/字典攻击通过盐渍解决。如果用户选择“密码”作为他的密码,彩虹/字典攻击将立即找到密码。但是由于您使用随机值对密码进行加盐,因此散列值将类似于d7("58gd0}78sq5sQIazuAKpassword,它不会出现在彩虹表/字典中。

于 2012-05-29T08:04:00.193 回答
0

你的担心是对的。散列密码提供任何安全层,因为现在有许多可用的工具(例如这里这里这里)来获取基于反向散列和散列目录的纯文本。我建议使用具有盐属性的JBcrypt,您不必将其存储在数据库中,并且由于任何人都不知道您的盐,即使您也不知道,那么取消散列并获取纯文本非常困难。

有关 BCrypt 的更多信息,请参见Wikipedia

于 2012-05-29T08:04:54.227 回答
0

盐渍和散列

这是使密码无法被人类读取并且难以取回用户可能在其他网站(例如信用卡网站)使用的原始密码的过程。

通过登录进行身份验证

现在您的用例是黑客使用普通登录表单通过蛮力登录,这不是应该做的加盐和散列密码,因为这是您的应用程序逻辑来防止使用错误的凭据进行多次登录。

结论

它是您的应用程序负责防止暴力登录,但不是通过加盐和散列密码。

于 2012-05-29T08:08:45.043 回答
-1

您可以通过强制执行强密码规则来保存应用程序免受蛮力攻击、彩虹攻击、字典攻击,例如密码应包含字母数字和特殊字符的组合,例如 myPassWord$10

于 2012-05-29T08:04:14.390 回答