2010-12-14 72 views
76

什么是密码散列的理想bcrypt工作因子。最佳bcrypt工作因子

如果我使用10的因子,我的笔记本电脑上的密码大约需要1秒。如果我们结束了一个非常繁忙的网站,那么只需检查人员的密码即可完成大量工作。

也许最好是使用7的工作因子,将每个笔记本电脑登录的总密码散列工作减少到大约.01s?

您如何决定暴力安全和运营成本之间的权衡?

+7

成本阻碍了离线攻击。当“在线”时,您可以在两次尝试之间使用最小延迟(例如5秒)以防止拒绝服务攻击。 – 2012-06-07 14:18:44

+3

关于InformationSecurity的重复:[为bcrypt推荐的回合数](http://security.stackexchange.com/q/17207/46416) – 2014-08-25 20:00:13

+1

对于任何感兴趣的人,我只写了一个小型Java CLI工具来测试服务器上的bcrypt性能(这对于平衡安全性,服务器负载和响应时间显然非常重要):https://github.com/cdraeger/hash-performance – Blacklight 2015-04-04 10:56:34

回答

96

请记住,该值存储在密码:$2a$(2 chars work)$(22 chars salt)(31 chars hash)。这不是一个固定的价值。

如果您发现负载过高,只需在下次登录时进行设置,就可以将密码更快地计算出来。同样,随着时间的推移和你得到更好的服务器,如果负载不是问题,你可以在登录时升级它们的散列强度。

诀窍是使它保持大致相同的时间与摩尔定律一起永远地走向未来。 该数字为log2,因此每次计算机速度加倍时,将默认数字加1。

决定你想要用多长时间来强制用户的密码。例如,对于一些常见的字典词,您的帐户创建可能已经警告他们他们的密码较弱。如果它是1000个常用单词中的一个,比如说,它需要攻击者0.1s来测试每个单词,然后将它们购买100s(好吧,有些单词更常见......)。如果用户选择了“常用字典单词”+ 2个数字,那就是两个多小时。如果您的密码数据库遭到入侵,并且攻击者每天只能获得几百个密码,那么您已经购买了大部分用户数小时或数天以安全更改其密码。这是购买时间的问题。

http://www.postgresql.org/docs/8.3/static/pgcrypto.html有一些破解密码供您考虑。当然,他们列出的密码是随机的。字典中的单词...实际上,您无法保存密码为12345的家伙。

+6

这真的是一个很好的答案。我甚至没有考虑过重新登录的想法。非常感谢! – Chris 2011-01-23 02:13:57

+1

recrypt如何工作?您必须将旧的bcrypt工作成本存储在某个地方,以便您可以使用它来登录它们,然后在验证其密码后,您将更新数据库中的哈希和成本? – 2013-06-13 21:57:55

+4

@JerrySaravia bcrypt的美妙之处在于成本存储在散列本身 - 所以你不需要存储_anything_ extra。只需使用当前的散列进行身份验证,然后立即重新生成具有不同代价的散列。简单! – 2013-08-21 09:42:39