较旧的php版本的password_compat

时间:2012-09-17 13:09:10

标签: php security hash passwords php-password-hash

PHP 5.5将support密码函数password_hash()password_verify()。此外,还有一个file可以在> 5.3.7中添加此功能。

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

有没有办法让这个旧的PHP版本能够使用这个功能?

3 个答案:

答案 0 :(得分:27)

所以,在我开始之前,让我明确一点。我是相关库的作者(以及5.5的补丁)。

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

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

现在,如果你坚持使用较低版本,你会怎么做?您可以分叉库并将$2y$调整为$2a$。那至少会让你上班。以这种方式生成的密码将在未来版本中可移植(该库旨在验证较旧的crypt()密码)。

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

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

答案 1 :(得分:5)

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

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

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

包的changelog有点不清楚。它提到添加了2x,但没有说明是否添加了2y(但可能是这样)。

答案 2 :(得分:4)

将5.3.7作为最低版本的原因是由于在早期版本的PHP中使用bcrypt的crypt()函数输出与当前版本截然不同的结果。

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

使用以下代码:

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

5.3.7 - 5.3.16,5.4.0 - 5.4.6

的输出
  

string(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的输出0.6

  

string(13)“$ 25di0cl7EYZA”

5.3.0 - 5.3.1

的输出
  

string(13)“$ 2v4FKr10WzJ2”