当使用PHP的crypt()函数创建bcrypt哈希时,我需要一个盐吗?

时间:2012-12-10 03:43:58

标签: php hash passwords cryptography bcrypt

我知道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个引用某个算法编号,则两个$之间的下一位是salt,之后的位是哈希。这是对的吗?

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

2 个答案:

答案 0 :(得分:2)

我认为当你使用它时,crypt使用SHA-512。

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

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

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

答案 1 :(得分:0)

函数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个。

相关问题