使用PHP时';s crypt()函数创建bcrypt哈希,是否需要一个salt?
我知道PHP的crypt()函数的工作原理如下:使用PHP时';s crypt()函数创建bcrypt哈希,是否需要一个salt?,php,hash,passwords,cryptography,bcrypt,Php,Hash,Passwords,Cryptography,Bcrypt,我知道PHP的crypt()函数的工作原理如下: crypt($password,$salt); 要创建bcrypt哈希(被认为是非常安全的),格式为: crypt("$2y$15$password",$salt); 其中$2y指定使用bcrypt,15是轮数,应该大于10 这是我的问题。运行: crypt("$2y$15$password"); 据我所知,生成一个很好的大随机salt并将其添加到散列中,当比较密码时,这是自动提取的。这意味着我不必在我的桌子上有盐场,也不必独立生产盐。这是
crypt($password,$salt);
要创建bcrypt哈希(被认为是非常安全的),格式为:
crypt("$2y$15$password",$salt);
其中$2y指定使用bcrypt,15是轮数,应该大于10
这是我的问题。运行:
crypt("$2y$15$password");
据我所知,生成一个很好的大随机salt并将其添加到散列中,当比较密码时,这是自动提取的。这意味着我不必在我的桌子上有盐场,也不必独立生产盐。这是否安全和正确
例如,当我运行时:
$test = "Hello";
echo crypt("$2y$15$test") . "\n";
我得到:
$6$R59d/nemygl0$/Gk6s57K2eFAkH4BWDGYhfdhbYGcqz.GRbD7qGDKOlhE5Lk.kgCoGQo/sDCCf1VDffdh7jtXPn/9rsexwrpFk1
其中前6表示某个算法编号,两个$之间的下一位是salt,后面的位是hash。这是正确的吗
另外,将此散列与另一个散列进行比较以进行验证的语法是什么?
谢谢。我认为您使用的crypt使用SHA-512 您可能忘记在crypt()中通过$test作为参数 根据php,您应该将密码作为第一个参数(不带任何前缀)传递,然后将salt作为第二个参数传递,并带有$2y$15前缀和22个字符的salt。例如
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');
函数crypt()
的用法如下:
$hashvalue = crypt($password, $cryptParams);
然而,盐必须由您自己生成,并且是$cryptParams的一部分
$bcryptAlgo = '$2y';
$cost = '$15';
$salt = '$' . functionThatGenerates22CharRandomSalt();
$cryptParams = $bcryptAlgo . $cost . $salt;
困难之一是生成有效的、唯一的和不可预测的salt。您所能做的最好的事情就是从操作系统随机源中读取数据
PHP5.5将拥有自己的函数password\u hash()
和password\u verify()
以简化此任务。我强烈建议使用这个优秀的api,还有一个适用于早期PHP版本的api。如果你想知道更多关于如何使用crypt的知识,请看一下这个
您的成本参数15是相当高的,如果您有足够的时间,请使用它,但今天的数字10是可以的