密码_hash相当于php 5.4?

时间:2014-08-18 21:53:49

标签: php hash passwords salt

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

2 个答案:

答案 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完成:)