PASSWORD_DEFAULT与PASSWORD_BCRYPT的区别

26

PASSWORD_DEFAULT和PASSWORD_BCRYPT有什么区别? 它们都使用Blowfish加密算法吗? 算法中的成本是什么意思? 如何在PHP中设置password_hash以产生255个哈希长度而不是60个?


1
为什么你想要一个255个字符的哈希而不是生成的60个字符的哈希? - Mark Baker
减缓暴力攻击的速度? - rexhin
1
一个更长的哈希值并不能减缓暴力攻击,成本才是起到这个作用的因素。长度并不等于安全,也不等于速度变慢。 - Mark Baker
解密一个255位的哈希字符串比60位的要花费更长的时间,这是不是真的?我认为会花费更多的时间。您能否解释一下为什么提高成本而不是增加哈希长度更好呢? - rexhin
2
不,长度并不是与破解哈希速度相关的主要因素... 该长度中位数的熵值比长度本身更重要,故故意减慢哈希执行的速度可将每秒尝试数百万个可能性的处理器农场的效率减少到数百种可能性。 password_hash() 故意减慢了速度,而增加 "cost" 将进一步降低速度。 - Mark Baker
再次感谢您提供这些出色而清晰的答案。 :) - rexhin
3个回答

37

目前只支持PASSWORD_BCRYPT算法(使用CRYPT_BLOWFISH),因此PASSWORD_DEFAULTPASSWORD_BCRYPT之间目前没有区别。 PASSWORD_DEFAULT的目的是为了允许在未来包含其他算法,届时将始终使用最强大的支持哈希算法应用PASSWORD_DEFAULT

“Cost”与执行算法迭代次数有关,会影响计算速度和生成的哈希值。更高的成本需要更长时间来执行,从而减缓暴力攻击。


我在谷歌搜索相关主题时偶然发现了你的答案,Mark。实际上,我的问题是“黑客如何获取密码mysql php?”因为我一直在问自己与我的查询相同的问题。如果机器找出一个密码,那么它不应该与与之关联的用户名匹配吗?他们首先如何从数据库中获取它?...我还没有找到这些问题的答案。 - Funk Forty Niner
1
黑客可以通过多种方式获取用户和密码列表,其中包括利用SQL注入漏洞修改查询或物理访问数据库服务器。这就是为什么需要保护密码哈希值的原因。 - Mark Baker
我曾经有同样的问题,但只是回显了 CRYPT_BLWFISHPASSWORD_BCRYPTPASSWORD_DEFAULT,发现它们都具有相同的值为“1”,因此它们目前必须是相同的。 - user1032531
如果将来更改默认设置,是否有可能向后兼容以读取存储在数据库中的现有密码? - BSUK
2
@BSUK 是的,它将向后兼容,因为生成的数据部分包括所使用的算法,因此 password_verify() 将始终知道如何验证哈希。 - Mark Baker

4
根据文档PASSWORD_DEFAULT旨在保持未来的兼容性。根据文档:PASSWORD_DEFAULT表示使用bcrypt算法(自PHP5.5.0起默认)。请注意,该常量的设计目的是随着时间推移而改变,因为PHP会添加新的和更强大的算法。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在可以扩展到60个字符以上(255字符是一个好选择)的数据库列中。

2
目前,PASSWORD_DEFAULTPASSWORD_BCRYPT之间没有区别。有关详细信息,请参见此处
哈希值的成本取决于应用哈希值的轮数。上面的链接中也有解释。如果您想提高哈希的安全性,最好增加哈希轮数而不是长度。

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