PHP 5.5将support密码函数password_hash()
和password_verify()
。此外,还有一个file可以在> 5.3.7中添加此功能。
我的问题是我目前正在运行debian软件包5.3.3-7 + squeeze14。
有没有办法让这个旧的PHP版本能够使用这个功能?
答案 0 :(得分:27)
所以,在我开始之前,让我明确一点。我是相关库的作者(以及5.5的补丁)。
据说,其他人提到的是绝对正确的。 5.3.7是最低版本的原因是所有版本之前的bcrypt实现中都有一个错误,可能导致密码使用高字节字符丢失(代码点> = 128)。
这是5.3.7作为最低版本的主要原因。我会高度建议升级到至少5.3.7,但最好是最新的(在不太旧的版本中发现了许多重要的安全问题)。
现在,如果你坚持使用较低版本,你会怎么做?您可以分叉库并将$2y$
调整为$2a$
。那至少会让你上班。以这种方式生成的密码将在未来版本中可移植(该库旨在验证较旧的crypt()
密码)。
但是,我建议你不要这样做。只需升级到更新版本的PHP即可。这并不难(来自dotdeb的deb包可以为你做)。
如果您真的被困在旧版本上,我建议您使用专为此设计的库。像我的PasswordLib或PhPass之类的东西(请注意,您应该只使用该库的链接版本,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$'));
string(60)“$ 2y $ 07 $ usesomesillystringfore2uDLvp1Ii2e./ U9C8sBjqp8I90dH6hi”
string(13)“$ 25di0cl7EYZA”
string(13)“$ 2v4FKr10WzJ2”