2

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

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

4

2 回答 2

2

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

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

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

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
于 2012-12-10T04:04:43.477 回答
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,还有一个兼容包可用于早期的 PHP 版本。如果您想了解更多关于如何使用 crypt 的信息,请查看这篇文章

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

于 2012-12-11T12:38:03.900 回答