今天(2016年5月)PHP密码_hash()+ password_verify()是否安全?

时间:2016-05-21 21:35:46

标签: php performance security encryption

所以问题就在于标题^^。

下面是我在服务器上测试性能的一些小PHP代码(+结果的截图),并且还向您展示了我打算如何简单地使用password_hash()和password_verify()。

我想我会选择PASSWORD_BCRYPT,费用= 11你觉得怎么样?

<?php
$startpage = microtime(true);
$userPassword = "ILike5InchesIceCubes";
echo "<h2>Password we work on :    " . $userPassword . "</h2></br></br>";


echo "<b>password_hash($userPassword, PASSWORD_BCRYPT) :</br></b>";
$start1 = microtime(true);
$hash = password_hash($userPassword, PASSWORD_BCRYPT);
echo "Hash is : " . $hash . "</br>";
echo "Encryption took : ". (microtime(true) - $start1) . " seconds </br>";
$start2 = microtime(true);
password_verify($userPassword, $hash);
echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>";

echo "<b>password_hash($userPassword, PASSWORD_DEFAULT) :</br></b>";
$start1 = microtime(true);
$hash = password_hash($userPassword, PASSWORD_DEFAULT);
echo "Hash is : " . $hash . "</br>";
echo "Encryption took : ". (microtime(true) - $start1) . " seconds </br>";
$start2 = microtime(true);
password_verify($userPassword, $hash);
echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>";

$cost = 4;
do {

        echo "<b>password_hash($userPassword, PASSWORD_BCRYPT, [\"cost\" =>" . $cost . "])</br></b>";
    $start1 = microtime(true);
    $hash = password_hash($userPassword, PASSWORD_BCRYPT, ["cost" => $cost]);
        echo "Hash is : " . $hash . "</br>";
        echo "Encryption took : ". (microtime(true) - $start1) ." seconds </br>";
        $start2 = microtime(true);
        password_verify($userPassword, $hash);
        echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>";

        $cost++;

} while ($cost <= 16);
$endpage = microtime(true);

echo "The whole page took : ". ($endpage - $startpage) . " seconds </br>";
?>

enter image description here

1 个答案:

答案 0 :(得分:6)

是的,password_hash()是要走的路。在Security StackExchange上有一篇很棒的帖子,其中包含更多信息here

  

使用bcrypt是一个好的开始;这是推荐的选择(或至少一个推荐的选择)。 documentation似乎表明PHP 最终正确地完成了任务。确保您的PHP版本至少为5.5.0。不要尝试使用盐:默认情况下,该功能会在需要时生成随机盐,这是正确的方法,所以只需让它完成它的工作。

     

你应该尝试改变成本&#34;选项也是。对于bcrypt,成本是4到31之间的值;每个增量意味着密码哈希的价格是服务器和攻击者的两倍。实际上,考虑到服务器功率,平均负载,峰值负载和最大用户耐心,您希望将该值设置为可以容忍的最高值:这将为您提供您可以期望的最佳安全性。

     

(请注意,我说&#34;最好的&#34;,不是&#34;好&#34;。)

     

如果您想了解良好密码哈希的基本概念,以及为什么bcrypt是一个不错的选择,start here

在PHP 5.5+中,

password_hash()得到了极大的改进,而这与PASSWORD_BCRYPT一起应该是一个很好的方法。