【发布时间】:2014-07-03 03:46:42
【问题描述】:
我有一个包含加盐哈希密码的用户数据库和一个他们登录的 Java 应用程序,这样做更好吗
SELECT COUNT(*) FROM `--database--` WHERE `username`= ? AND `passwordHash`= ?;
如果计数为1,则让他们登录,否则...
SELECT `passwordHash` FROM `--database--` WHERE `username`= ?;
...然后在用户应用程序上本地验证它。
哪个更安全? - 我通常使用第一种方式,但我不断看到第二种方式出现在这里和那里。
供参考,我正在使用的系统:https://codereview.stackexchange.com/questions/55900/password-hashing-method-in-java
【问题讨论】:
-
它们的行为方式相同。无论哪种方式,您都需要以某种方式比较哈希
-
我看到的第二种变体的唯一安全隐患是,当您检测到不匹配的哈希值时,您可能很想给出错误消息“无效密码”。这本身可能是一个安全漏洞,因为您刚刚透露用户名存在。与变体本身无关,只是一般要记住的一件事:错误消息可能会向攻击者泄露有价值的信息。
-
您的标题谈到了加盐哈希,但第一个查询显然不适用于加盐密码,因为您需要获取盐来计算哈希。
标签: java security encryption