【问题标题】:password_hash equivalent for php 5.4? [duplicate]php 5.4的password_hash等价物? [复制]
【发布时间】:2014-10-11 22:00:51
【问题描述】:

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

【问题讨论】:

  • 为什么要使用mt_rand 生成盐? password_hash 默认生成更安全的盐。

标签: php hash passwords salt


【解决方案1】:

当我使用 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 个字符完成的 :)

【讨论】:

  • 拜托,拜托,请不要提倡将mt_rand() 用于与安全相关的任何事情。
  • 是的,我猜你没有阅读我帖子的底部;)
【解决方案2】:

使用password_compat。这是一个向后兼容的库,用于在旧版本的 PHP(5.3.7+)中模拟 password_hash()

【讨论】:

  • 太棒了!谢谢。我发布的简单哈希/盐可以安全使用吗?我知道有更好的方法,但这是 php 手册中的内容..
  • 不,盐的生成在您的代码中不够安全。让库生成盐。
  • 我自己有点喜欢 Whirlpool ;)
  • @bagofmilk 当你说“你知道有更好的方法”时,你具体在说什么?
  • @bagofmilk PHP 手册中在哪里使用mt_rand 生成盐?它不在password_hash的示例中
猜你喜欢
  • 2014-09-11
  • 2011-02-28
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2011-04-06
  • 2018-07-02
  • 2012-10-21
  • 2010-09-27
相关资源
最近更新 更多