使用PHP5.4.16的Bcrypt-工作级别

使用PHP5.4.16的Bcrypt-工作级别,php,cryptography,bcrypt,crypt,Php,Cryptography,Bcrypt,Crypt,我希望将BCrypt实现到web应用程序中,但在如何合并/更改工作/迭代/轮次级别方面,我迷失了方向: 州 从PHP5.3.0开始,PHP包含自己的实现 我理解使用$pw=crypt($password)将自动为我创建一个随机的salt,我只需将$pw存储在数据库中即可 我知道我可以使用 if ( crypt($user_input, $pw) == $pw) ) { // password is valid } else { // password is not valid }

我希望将BCrypt实现到web应用程序中,但在如何合并/更改工作/迭代/轮次级别方面,我迷失了方向:

从PHP5.3.0开始,PHP包含自己的实现

我理解使用
$pw=crypt($password)
将自动为我创建一个随机的salt,我只需将
$pw
存储在数据库中即可

我知道我可以使用

if ( crypt($user_input, $pw) == $pw) ) {
    // password is valid
} else {
    // password is not valid
}
我知道Bcrypt如此优秀的原因是Bcrypt是一个基于河豚穴的自适应函数。随着时间的推移,子弹的数量可以增加,使其速度变慢,因此尽管计算技术更快,它仍然能够抵抗暴力攻击

因此,我的问题是,如何减慢或加快密码有效性的检查?或者从另一个角度讲,如何设置创建哈希密码所需的默认迭代次数?

这里有一个解决方案:

用法:

$options = array('cost' => 8); // 2^cost is the number of iterations 
$hash = password_hash("adsfasdf", PASSWORD_BCRYPT, $options);
有关更全面的答案,请参阅:

所有内容都在列表中。本例中的盐值必须为

“$2y$”,一个两位数的成本参数“$”,以及 字母表“/0-9A-Za-z”。在中使用此范围之外的字符 salt将导致crypt()返回长度为零的字符串。两位数 cost参数是项目的迭代计数的以2为底的对数 底层基于河豚的哈希算法计,必须在范围内 04-31,超出此范围的值将导致crypt()失败

因此,对于1024(2^10)轮,呼叫应为

crypt($user_input, "$2y$10$......................");
其中,每个
代表法定字母表中的一个salt字符。将参数
10
增加/减少一次将分别使轮数加倍/减半。

函数
crypt()
不会为您生成随机salt。不过,PHP5.5有一个新函数调用,它将自动生成安全的盐来处理所有的事情。它将在内部调用crypt()函数。使用
password\u hash()
取而代之的是,对于早期的PHP版本也存在一个。