PHP 5.5 将支持密码功能password_hash()
和password_verify()
. 还有一个文件可以在 >5.3.7 中添加此功能。
我的问题是我目前正在运行 debian 包 5.3.3-7+squeeze14。
有没有办法让这个函数在这个旧的 PHP 版本中可用?
所以,在开始之前,让我先澄清一件事。我是相关库的作者(以及 5.5 的补丁)。
话虽如此,其他人所说的绝对正确。5.3.7 是最低版本的原因是之前的所有版本在 bcrypt 实现中都有一个错误,这可能导致使用高字节字符(代码点 >= 128)的密码中的熵丢失。
这就是 5.3.7 成为最低版本的主要原因。我强烈建议至少升级到 5.3.7,但最好是最新的(在不太旧的版本中发现了许多重要的安全问题)。
现在,如果您卡在较低的版本上,该怎么办?您可以分叉库并调整$2y$
为$2a$
. 这至少会让你工作。以这种方式生成的密码将可移植到未来的版本中(该库旨在能够验证旧crypt()
密码)。
但是,我建议您不要这样做。只需升级到较新版本的 PHP。这并不难(有来自dotdeb的 deb 包可以为您完成)。
如果您真的卡在旧版本上,我建议您使用为此设计的库。像我的PasswordLib或PhPass 之类的东西(请注意,您应该只使用该库的链接版本,github 上还有其他几个完全不同的版本)。
将 5.3.7 设为最低版本的原因是,crypt()
在早期版本的 PHP 中使用 bcrypt 的函数输出的结果与当前版本大不相同。
您可以自己查看结果:http: //3v4l.org/3cAZf
使用以下代码:
<?php
var_dump(crypt('rasmuslerdorf', '$2y$07$usesomesillystringforsalt$'));
字符串(60)“$2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi”
字符串(13)“$25di0cl7EYZA”
字符串(13)“$2v4FKr10WzJ2”
2y
需要 PHP >= 5.3.7,因为该版本中包含了固定的 bcrypt 算法。对于字节超出 US-ASCII 范围的密码,之前的2a
算法被破坏了。
您的 5.3.3-7+squeeze14 版本很可能也包含此修复程序。发行版通常保留在某个特定版本,但向后移植安全修复程序(例如这个)。
因此,您应该只检查该算法是否可用,如果可用,您可以安全地使用 password_compat。
包的更新日志有点不清楚。它提到2x
已添加,但没有说明是否2y
也添加了(但可能是)。