【问题标题】:pbkdf2 Salted Hash Password Verificationpbkdf2 加盐哈希密码验证
【发布时间】: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


【解决方案1】:

在我看来,数据库也会有salt,应用程序需要它来计算哈希。因此你应该使用

SELECT `passwordHash`, `Salt` FROM `--database--` WHERE `username`= ?;

并在应用程序级别执行比较。

这种责任分工稍后会在您构建身份验证机制时派上用场,例如如果添加lockout 机制:

SELECT `passwordHash`, 
       `Salt`, 
       `LockoutStatus` 
FROM   `--database--` 
WHERE  `username`= ?;

如果您没有使用用户特定的盐或锁定,那么您就有潜在的安全问题。请参阅有关此主题的oWASP guidance

【讨论】:

  • 我使用的方法只有一个哈希字段,你能在这里看看吗:代码审查部分的codereview.stackexchange.com/questions/55900/…,到目前为止我还没有得到任何答案
  • 您并不总是将盐存储在数据库中。许多应用程序使用单一的盐,有些将它与用户名结合使用。
  • 艾略特,这是真的。然而,我的建议与既定的最佳实践是一致的。
  • Crizly,在您的情况下,您的 API 在密码哈希本身中包含盐。因此,您的代码将需要解析它从数据库中获得的散列(由 : 分隔)并计算散列以进行比较。
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2012-11-04
  • 2012-01-31
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
相关资源
最近更新 更多