我有一个盐渍哈希密码的用户数据库和他们登录的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
答案 0 :(得分:3)
对我来说,数据库也会有salt,应用程序需要它来计算哈希值。因此你应该使用
SELECT `passwordHash`, `Salt` FROM `--database--` WHERE `username`= ?;
并在应用程序级别执行比较。
随着您构建身份验证机制,例如,此责任分工将派上用场。如果您添加lockout机制:
SELECT `passwordHash`,
`Salt`,
`LockoutStatus`
FROM `--database--`
WHERE `username`= ?;
如果您没有使用特定于用户的salt或锁定,则可能存在安全问题。请参阅此主题的oWASP guidance。