当我使用 PHP 5.4 时,我使用了 php 的 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 的答案更好,因为使用经过良好测试的库更安全。我只是想看看后备箱下面发生了什么。
警察:你问过
有没有办法让这个等效代码(如下)在 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;
老实说,我确定 salt 有 18 个字符,但看看我的旧代码,它是用 21 个字符完成的 :)