密码哈希:PBKDF2(使用sha512 x 1000)与Bcrypt

17

我一直在阅读关于Gawker事件的文章,有几篇文章提到只使用bcrypt来哈希密码,我想确保我的哈希机制足够安全,以避免切换到另一种方法。在我的当前应用程序中,我选择了一个PBKDF2实现,利用sha2-512和至少1000次迭代。

我能否询问使用PBKDF2与Bcrypt的意见,以及是否应该实施更改?

2个回答

29
截至2022年,最好使用内存加强函数(例如scrypt或Argon2)。Bcrypt也可以是一种选择,但它不是内存加强的。
至于PBKDF2,建议在2000年时使用1000次迭代,现在需要更多。
此外,在使用bcrypt时应更加小心:
值得注意的是,虽然对于大多数类型的密码来说bcrypt比PBKDF2更强大,但对于长的口令短语而言,它则落后了;这是因为bcrypt无法使用超过口令短语的前55个字符。尽管我们估计的成本和NIST的口令熵估计表明bcrypt的55个字符限制目前不太可能引起问题,但依赖于bcrypt的系统实现者可能会明智地绕过这个限制(例如,通过“预哈希”口令短语使其适合55个字符的限制),或者采取措施防止用户在第56个及其后面的字符中放置太多的口令熵(例如,通过要求网站的用户将其密码输入只有空间容纳55个字符的输入框中)。
从scrypt论文[PDF]中可以看到:http://www.tarsnap.com/scrypt/scrypt.pdf 话虽如此,还有scrypt
任何比较都不完整,如果没有上述提到的scrypt论文中的表格:
其中PBKDF2-HMAC-SHA256的迭代计数分别为86,000和4,300,000。这张表格显示了一年内破解密码所需的硬件估计成本。

5
要求网站用户在只有55个字符空间的输入框中输入他们的密码。对于现实世界有何用处?我几乎无法想出8个字符的密码。 - m33lky
7
我认识一个人,他使用伟大棋局的序列作为密码,并在其中加入选手姓名、日期、比赛城市等信息以增强安全性。我还知道另一个人使用史诗诗歌的诗句作为密码,并故意添加错误。有很多方法可以获得非常长的密码。 - Cheeso
1
需要注意的是,在scrypt论文中存在一个错误,而bcrypt实际的算法截止长度为72个字符。因此仍然存在截止长度,但其熵增加了128位,这非常重要。 - ircmaxell
@ircmaxell 取决于实现(大多数都接受72字节),但Blowfish的有效密钥大小为448位;虽然它可以接受高达576位(正如您所说的72字节),但“P数组的最后四个值不会影响密文的每一位”(引用自维基百科https://en.wikipedia.org/wiki/Blowfish_(cipher)#The_algorithm)。 - dchest
1
@m33lky 使用密码短语而不是密码是现实世界中正在被采用的一种方法。密码短语往往可以轻松超过55个字符的长度,并且通常比随机数字+字符+符号更容易记忆(http://www.codinghorror.com/blog/2005/07/passwords-vs-pass-phrases.html)。 - 2Toad
@2Toad 你说得没错,但是你忘了提到如果长度大致相同的话,密码短语也比随机的 char 更容易被破解。 - Can H. Tartanoglu

-9

关于标题的评论:

  • 除非必须,否则不要使用加密(可逆)来存储密码。
  • 既然您提出了散列(不可逆)作为一种替代方案,我认为您不需要可逆性。

对于 PBKDF2 和 Bcrypt 的使用意见以及是否应该实施更改?

我的看法:

使用 PBKDF2 而非 Bcrypt。 (我只是比较相信 SHA 胜过 Blofish,没有任何理由)

至于是否应该“实施更改”,我不知道您在问什么。

已编辑以更清晰地将加密/哈希讨论与表述算法偏好分开。


实现一项更改,即将我的脚本转换为使用bcrypt而不是PBKDF2算法。 - buggedcom
5
我不相信bcrypt是加密。它是一种基于BLOWFISH的单向哈希机制。 - buggedcom
BCrypt是一种哈希算法。 - Keith Palmer Jr.
12
-1. Bcrypt用于哈希,而不是加密。您的回答有暗示它用于加密(这对于存储密码是不好的)。如果您能澄清您的观点,以便读者不太可能认为Bcrypt用于加密,那我会很快撤销我的投票。 - David Murdoch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接