【问题标题】:What should be stored in table while using bcrypt使用 bcrypt 时应该在表中存储什么
【发布时间】:2015-02-19 23:09:01
【问题描述】:

我正在查看this article 并找到了以下格式的哈希,这是我们使用 bcrypt 时返回的。我发现这个哈希应该存储在数据库中(以 varchar(60) 格式左右),并在需要任何用户身份验证时使用。

我的疑问是,如果我的数据库遭到入侵,攻击者将已经知道我使用的算法、成本和盐,这将使他的工作变得非常容易。我是这么认为的,因为现在他甚至不需要猜测他必须使用的算法(bcrypt、SHA、MD5 等)来通过暴力破解获取用户的密码。

相反,我觉得我应该只使用最后一部分(最后一个 $ 之后的部分)并在我的脚本中添加另一部分,然后像这样匹配

<?php

$options = array('cost' => 11);
echo password_hash("akki", PASSWORD_BCRYPT, $options)."\n";
// $2y$11$mrblnrK01GWt4g55.Z8Zs.1RslouNzBqCVW826QfBEuaRaVyq96c2

?>

我可以将mrblnrK01GWt4g55.Z8Zs.1RslouNzBqCVW826QfBEuaRaVyq96c2 部分存储在数据库中

要根据现有哈希验证用户提供的密码,我可以使用以下函数:

<?php
// Query the db to get $hash.
$hash = 'mrblnrK01GWt4g55.Z8Zs.1RslouNzBqCVW826QfBEuaRaVyq96c2';
$hash = '$2y$11$'.$hash;

if (password_verify('akki', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

我发现了一个类似的问题here,但它没有说明为什么显示算法(和成本)不是风险,尽管我理解为什么显示盐不是问题。此外,当我尝试更改算法或成本时,这可能会有所帮助的原因似乎不值得冒险。

【问题讨论】:

  • 整个东西应该进入数据库。攻击者是否获得盐和算法并不重要。这些不应该是秘密的。此外,如果您没有将盐存储在数据库中,那么您可能对每个密码都使用相同的盐,这是您不应该这样做的。应为每条记录随机生成盐并使用一次。
  • 作为一般规则,将安全性留给设计哈希函数的数学家。比我们这些凡人好无限trying to obscure our protocols.
  • @Joel 我确信把安全留给他们是我能做的最好的事情..只是想知道它是如何工作的:-)
  • @meagar 我同意你的观点,这正是我到处读到的。我的问题是“为什么”?

标签: php mysql hash bcrypt


【解决方案1】:

为什么展示算法(和成本)不是风险

因为暴力破解仍然几乎是不可能的。风险没有有意义的增加。即使知道使用的算法和成本,每个密码也需要很多 很多

您不存储该信息所做的唯一一件事就是使升级算法变得更加困难和/或在以后增加成本。随着更强大的硬件、新的攻击方法和更强大的算法等东西开始发挥作用,这些东西需要升级。

对于大多数用途而言,实用的做法是将计算单个哈希所需的时间保持在 0.3-0.5 秒左右。

您所做的任何使升级和重新散列变得更加困难的事情都会降低发生这种情况的可能性。这就是引入风险的原因。


当有效的攻击途径针对您使用的哈希函数时,您会怎么做?

这不是理论上的。在 GPU 加速攻击出现之前,很多人都对 SHA1 非常满意。

如果您要存储整个字符串,则在用户登录时通过password_needs_rehash() 运行它并根据需要重新设置密码是很简单的。

如果您已分离算法和选项指标并对其进行硬编码 - 您将如何升级*?只是更改它们意味着没有旧哈希的人可以登录。并且您无法生成新的哈希直到用户登录,因此您需要在某处维护算法+选项到哈希的映射。 ..

类似于数据库的地方。

存储整个字符串。


* 如果您不升级,而是通过默默无闻地依赖安全性,那么攻击者只需确定您使用一次的方法,就可以立即打开所有内容.我什至不会将其视为一种选择。

【讨论】:

  • 我确实认为,如果你写出像 $2$10$ 这样的东西,攻击者会立即知道它是河豚,如果你不使用它,他/她需要先找出它,然后才能发现它。开始....以及您所说的升级会更难,是的,好像您增加了成本,您要么需要在自己的脚本中添加一些东西来检查旧版本和新版本,要么您有更改所有行...两者都有其优点和缺点......
  • 我不明白为什么仍然几乎不可能破解密码。攻击者现在只需要一些时间,他将能够通过暴力破解获取密码。谢谢
  • @PaulCrovella 非常感谢。我不知道我担心的“某个时间”会变成“很多很多年”。这说明了这一点。再次感谢您。
  • @PaulCrovella 就知识而言,我们可以做任何计算来证明这一点(需要很多年的时间),还是只是某些文件中作为理论给出的结论。只是好奇。谢谢
  • @PaulCrovella 谢谢。也许我需要阅读更多内容才能理解这些东西。
猜你喜欢
  • 2011-06-23
  • 2010-11-13
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2013-04-01
  • 2013-04-30
  • 2017-12-28
相关资源
最近更新 更多