12

PHP 5.5 将支持密码功能password_hash()password_verify(). 还有一个文件可以在 >5.3.7 中添加此功能。

我的问题是我目前正在运行 debian 包 5.3.3-7+squeeze14。

有没有办法让这个函数在这个旧的 PHP 版本中可用?

4

3 回答 3

28

所以,在开始之前,让我先澄清一件事。我是相关库的作者(以及 5.5 的补丁)。

话虽如此,其他人所说的绝对正确。5.3.7 是最低版本的原因是之前的所有版本在 bcrypt 实现中都有一个错误,这可能导致使用高字节字符(代码点 >= 128)的密码中的熵丢失。

这就是 5.3.7 成为最低版本的主要原因。我强烈建议至少升级到 5.3.7,但最好是最新的(在不太旧的版本中发现了许多重要的安全问题)。

现在,如果您卡在较低的版本上,该怎么办?您可以分叉库并调整$2y$$2a$. 这至少会让你工作。以这种方式生成的密码将可移植到未来的版本中(该库旨在能够验证旧crypt()密码)。

但是,我建议您不要这样做。只需升级到较新版本的 PHP。这并不难(有来自dotdeb的 deb 包可以为您完成)。

如果您真的卡在旧版本上,我建议您使用为此设计的库。像我的PasswordLibPhPass 之类的东西(请注意,您应该只使用该库的链接版本,github 上还有其他几个完全不同的版本)。

于 2012-09-17T14:22:28.330 回答
5

将 5.3.7 设为最低版本的原因是,crypt()在早期版本的 PHP 中使用 bcrypt 的函数输出的结果与当前版本大不相同。

您可以自己查看结果:http: //3v4l.org/3cAZf

使用以下代码:

<?php
var_dump(crypt('rasmuslerdorf', '$2y$07$usesomesillystringforsalt$'));

5.3.7 - 5.3.16、5.4.0 - 5.4.6 的输出

字符串(60)“$2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi”

4.3.0 - 4.3.11、4.4.0 - 4.4.9、5.0.0 - 5.0.5、5.1.0 - 5.1.6、5.2.0 - 5.2.17、5.3.2 - 5.3.6 的输出

字符串(13)“$25di0cl7EYZA”

5.3.0 - 5.3.1 的输出

字符串(13)“$2v4FKr10WzJ2”

于 2012-09-17T13:27:14.043 回答
5

2y需要 PHP >= 5.3.7,因为该版本中包含了固定的 bcrypt 算法。对于字节超出 US-ASCII 范围的密码,之前的2a算法被破坏了。

您的 5.3.3-7+squeeze14 版本很可能也包含此修复程序。发行版通常保留在某个特定版本,但向后移植安全修复程序(例如这个)。

因此,您应该只检查该算法是否可用,如果可用,您可以安全地使用 password_compat。

包的更新日志有点不清楚。它提到2x已添加,但没有说明是否2y也添加了(但可能是)。

于 2012-09-17T13:27:54.053 回答