我使用安装了PHP 5.5的XAMPP开发了我的网站。我只是意识到我的主机只有php 5.4(还不能更新到5.5)。我的问题是我不能使用新的PHP 5.5 password_hash()
功能。对于php 5.4,有没有一种等效的盐散列方法?
有没有办法让这个等效的代码(如下)在php 5.4中运行?
$options = [
'salt' => uniqid(mt_rand(), true),
'cost' => 12
];
$hash = password_hash($mypassword, PASSWORD_DEFAULT, $options);
答案 0 :(得分:17)
使用password_compat。它是一个向后兼容的库,可以在旧版本的PHP(5.3.7 +)中模拟password_hash()
。
答案 1 :(得分:5)
当我使用PHP 5.4时,我使用了PHP' s crypt function和CRYPT_BLOWFISH哈希类型。我玩了一些参数来匹配你的情况,并得出结论:你的blowfish Pre
应该是$2y$12$
以匹配你的cost = 12
参数。
您可以在命令行中运行此脚本以验证结果是否匹配(我会在此部分中保留您的不安全mt_rand salt。稍后会详细介绍)
<?php
$salt= uniqid(mt_rand(), true);
$options=['salt'=>$salt, 'cost'=>12];
$mypassword=$argv[1];
$cryptpwd=crypt($mypassword,'$2y$12$'.$salt.'$'); // PHP 5.4 style
$pwdhash=password_hash($mypassword, PASSWORD_DEFAULT, $options); // PHP 5.5+
echo "\n";
echo 'CRYPT :'. $cryptpwd;
echo "\n";
echo 'PWD HASH :'. $pwdhash;
echo "\n";
if($cryptpwd===$pwdhash) {
echo 'Hashes match!';
} else {
echo 'Hashes do not match';
}
echo "\n";
例如
php pwd.php 1q2w3e4r5t
输出
CRYPT :$2y$12$22253563353f27f9b3292ereZv98r1iFQhItfYT0UbKaejMSJThBi
PWD HASH :$2y$12$22253563353f27f9b3292ereZv98r1iFQhItfYT0UbKaejMSJThBi
Hashes match!
@ JohnConde的答案更好,因为使用经过良好测试的库更安全。我只想看看行李箱下面发生了什么。
PD:你问过有没有办法让这个等效的代码(如下)在php 5.4中运行?
现在,您的代码有主要弱点。您正在使用mt_rand生成salt。 不要那样做。使用salt生成信任系统,如果你真的想自己生成它,请使用类似下面的salt生成器(当我的应用程序是PHP 5.4时,我使用了这个)
$Allowed_Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$Chars_Len = 63;
$Salt_Length = 21;
$salt = "";
$Blowfish_Pre='$2y$12$';
$Blowfish_End='$';
for ($i = 0; $i < $Salt_Length; $i++) {
$salt.= $Allowed_Chars[mt_rand(0, $Chars_Len) ];
}
$bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
说实话,我确信盐有18个字符,但是看看我的旧代码,用21完成:)