我知道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,之后的位是哈希。这是对的吗?
此外,将此哈希与另一个哈希进行比较以进行验证的语法是什么? 感谢。
答案 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个。