【问题标题】:When using PHP's crypt() function to create a bcrypt hash, do I need a salt?当使用 PHP 的 crypt() 函数创建 bcrypt 哈希时,我需要盐吗?
【发布时间】:2012-11-27 11:56:23
【问题描述】:

我了解 PHP 的 crypt() 函数是这样工作的:

crypt($password,$salt);

创建 bcrypt 哈希(被认为非常安全)的格式是:

crypt("$2y$15$password",$salt);

其中$2y指定使用bcrypt,15为轮数,应在10以上。

这是我的问题。运行:

crypt("$2y$15$password");

在我的理解中,生成一个不错的大随机盐并将其添加到哈希中,当比较密码时,它会自动提取。这意味着我不必在我的表中有一个盐字段,或者独立生成一个盐。这安全且正确吗?

例如,当我运行时:

$test = "Hello";
echo crypt("$2y$15$test") . "\n";

我明白了:

 $6$R59d/nemygl0$/Gk6s57K2eFAkH4BWDGYhfdhbYGcqz.GRbD7qGDKOlhE5Lk.kgCoGQo/sDCCf1VDffdh7jtXPn/9rsexwrpFk1 

其中前 6 位指代某个算法编号,两个 $ 之间的下一位是盐,之后的位是哈希。这是正确的吗?

另外,将此哈希与另一个哈希进行比较以进行验证的语法是什么? 谢谢。

【问题讨论】:

    标签: php hash passwords cryptography bcrypt


    【解决方案1】:

    函数crypt()应该这样使用:

    $hashvalue = crypt($password, $cryptParams);
    

    而盐必须由您自己生成,并且是 $cryptParams 的一部分。

    $bcryptAlgo = '$2y';
    $cost = '$15';
    $salt = '$' . functionThatGenerates22CharRandomSalt();
    $cryptParams = $bcryptAlgo . $cost . $salt;
    

    其中一个困难是生成有效、独特且不可预测的盐。你能做的最好的就是从操作系统随机源中读取。

    PHP 5.5 将拥有自己的函数password_hash()password_verify(),以简化此任务。我强烈推荐使用这个优秀的 api,还有一个 compatibility pack 可用于早期的 PHP 版本。如果您想了解更多有关如何使用 crypt 的信息,请查看此article

    你的成本参数 15 是相当高的,如果你能承受这么多的时间就用它,但是今天 10 的数字是可以的。

    【讨论】:

      【解决方案2】:

      我认为您使用的 crypt 使用 SHA-512。

      您可能忘记在 crypt() 中将 $test 作为参数传递。

      根据 php docs,您应该将密码作为第一个参数(不带任何前缀)传递,然后将盐作为第二个参数传递,并带有 $2y$15 前缀和 22 个字符的盐。例如。

      crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 2014-07-01
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多