我希望将BCrypt实现到Web应用程序中,但是我在如何合并/更改工作/迭代/轮次方面感到迷茫:
从PHP 5.3.0开始,PHP包含自己的实现。
我知道使用$pw = crypt($password);
会自动为我创建一个随机盐,我只能将$pw
存储在数据库中。
我了解我可以使用
检查密码有效性if ( crypt($user_input, $pw) == $pw) ) {
// password is valid
} else {
// password is not valid
}
我知道Bcrypt如此优秀的原因是bcrypt是一个基于Blowfish地穴的自适应功能。随着时间的推移,可以增加轮数以使其更慢,因此尽管计算技术更快,它仍然可以抵抗暴力攻击。
所以我的问题是,如何减慢或加快检查密码的有效性?或者换句话说,如何设置创建哈希密码所需的默认迭代次数?
答案 0 :(得分:3)
这是一个解决方案:
https://github.com/ircmaxell/password_compat
用法:
$options = array('cost' => 8); // 2^cost is the number of iterations
$hash = password_hash("adsfasdf", PASSWORD_BCRYPT, $options);
有关更多答案,请参阅here:
答案 1 :(得分:1)
全部都在documentation。在这种情况下,盐值必须
" $ 2y $",一个两位数的成本参数," $"和来自的22个字符 字母" ./ 0-9A-Za-z"。使用此范围之外的字符 salt将导致crypt()返回零长度字符串。两位数 cost参数是迭代计数的基数2对数 底层基于Blowfish的散列算法,必须在范围内 04-31,超出此范围的值将导致crypt()失败。
因此,对于1024(2 ^ 10)轮,调用应为
crypt($user_input, "$2y$10$......................");
其中每个.
代表法律字母表中的一个盐字符。将参数10
增加/减少一倍,分别将轮数加倍/减半。