PHP 5.4中的password_hash替代方法是什么?

11

我使用已安装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);

1
你为什么要使用 mt_rand 来生成盐值?password_hash 默认会生成更加安全的盐值。 - Andrea
2个回答

20

太棒了!谢谢。我发布的简单哈希/盐是否安全使用?我知道有更好的方法,但这是php手册中的内容。 - bagofmilk
6
不,你的代码中生成的盐不够安全。请让库来生成盐。 - Gergo Erdosi
我个人比较喜欢惠而浦 ;) - Funk Forty Niner
@bagofmilk 当你说“你知道有更好的方法”时,你具体指的是什么? - ircmaxell
1
@bagofmilk mt_rand 在 PHP 手册中哪里用于生成盐?在 password_hash 的示例中没有看到。 - Andrea

5
当我使用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() - Ja͢ck
是啊,我猜你没有读完我帖子的底部部分 ;) - ffflabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接