当我使用PHP 5.4时,我使用了php的
crypt函数与CRYPT_BLOWFISH哈希类型。我尝试了一些参数来匹配你的情况,并得出结论,你的
blowfish Pre
应该是
$2y$12$
以匹配你的
cost = 12
参数。
您可以在命令行中运行此脚本以验证结果是否匹配(
我将在此部分保留您不安全的mt_rand盐。稍后会有更多信息)。
<?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生成盐。千万不要那样做。相信系统进行盐生成,如果您真的想自己生成,请使用类似以下盐生成器(当我的应用程序为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个字符组成的 :)
mt_rand
来生成盐值?password_hash
默认会生成更加安全的盐值。 - Andrea