【问题标题】:Bcrypt securityBcrypt 安全性
【发布时间】:2012-08-02 15:46:38
【问题描述】:

我知道这是一个“过度询问”的话题,Bcrypt,但是我对它的安全性有一些担忧。

我一直在使用sha512($password.$salt),然后寻找更好的解决方案并遇到了Bcrypt

我担心的是,在阅读它时,它说轮数 ($02$) 和盐存储在哈希中的 3 个单独的“块”中,就像这样,$rounds$.$salt.$hash(或者至少我就是这样已经解释过了)。

我的问题是:这不是不安全吗?显示使用的轮数,盐分清楚可用。因为攻击者可以说“好吧,我需要 2 轮,salt 是 123salt,这就是哈希”,对吧?

我明白阅读时,安全并不是“全部”,而是破解密码需要多长时间,这就是 Bcrypt 的好处,它很慢。

谁能澄清我的误解/误解?

谢谢。

【问题讨论】:

  • 你现在如何储存盐?
  • 我问了同样的问题:stackoverflow.com/questions/9420722/…
  • SLaks,我目前将哈希插入 mysql 数据库 - 虽然我已经阅读 Bcrypt 已经包含盐,但我添加了另一个,就像这样 Bcrpyt($email.$random_salt.$password,14轮)并将结果插入数据库。 MathieuImbert - 我没有意识到。我确实检查了该框何时出现并说“类似问题”。
  • 如果您已经将盐存放在那里,您还担心什么?
  • 不太确定我是否理解您的问题,如果我误解了它,请见谅。我实际上并没有将随机盐存储在数据库中,而是将其包含在哈希中。如果你的意思是盐已经被展示了,我真的无能为力——这就是 Bcrypt 的“设计”。

标签: php bcrypt


【解决方案1】:

bcrypt 通过不可降低的复杂性来实现安全性;不是默默无闻的安全。

加盐的目的是防止攻击者对多个用户重复使用计算。
将其交给攻击者并没有错。

同样,即使攻击者知道您使用了多少发子弹,也不会花费那么多时间(假设您使用的发子弹数相当多)。
使用多轮的意义不是攻击者不知道要使用多少轮;就是每一轮都迫使攻击需要更长的时间。

【讨论】:

  • 哦,好吧,我认为加盐是为了让密码更安全,如果可能的话,攻击者不会知道它。我想这更有意义/澄清的事情,谢谢。
  • @Anonymous2011:加盐是为了使预先构建的查找表变得多余。攻击者必须从头开始计算完整的表。
  • @Anonymous2011:对攻击者隐藏盐会有所帮助(假设您可以在维护每个用户盐的同时有效地做到这一点),但这根本不是必需的。
  • 您可以做的是使用仅存储在不同服务器上的单独安全存储中的密钥来加密 bcrypt 哈希的结果。这将使您的数据库对攻击者更加无用。
  • 利;啊,好吧,我想这确实有道理。斯莱克斯;目前在开发中,我将盐一起存储在用户表中,每个用户的每种盐都不同。在生产中,我正在考虑创建另一个数据库来存储盐(不同的用户名/密码等)以提高安全性。我认为这比我现在想要做的要复杂一些,但是我不会错过 - 感谢那里的提示,没有考虑过这样做。
【解决方案2】:

盐与散列一起存储,因为每个散列使用不同的盐,这与您之前使用 sha512 的方法不同,在该方法中,您对每个散列使用相同的盐。

使用此方法,单个彩虹表仅适用于单个密码,而如果对每个哈希使用相同的盐,则单个彩虹表将适用于所有哈希。

还需要存储工作因子(您称之为“轮数”),以便正确验证哈希。是的,你可以把它去掉,但这真的没有坏处。


bcrypt 被设计为一种密集型算法。计算单个散列的成本很高,并且不可能为具有高工作因子的散列创建查找表。

工作因素被设计为随着技术的进步而改变,因此破解 bcrypt 哈希总是困难。但是您只能在验证密码的过程中升级哈希。

您最终可能会得到一个系统,其中不同的哈希存储了不同的工作负载值,具体取决于哪些已升级,哪些尚未升级。

【讨论】:

  • 那是我的错,我应该澄清我正在使用带有 sha512 的随机盐 - 但是我看到你关于使用一种“静态”盐的观点并不好。现在我了解了彩虹表如何更好地工作以及它们如何在密码破解中发挥作用,但我完全搞错了。我可以看到 Bcrypt 现在变得更好了。
猜你喜欢
  • 2019-09-23
  • 2015-08-11
  • 2020-08-07
  • 1970-01-01
  • 2023-03-15
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多