【问题标题】:Bcrypt with PHP 5.4.16 - level of workBcrypt 与 PHP 5.4.16 - 工作级别
【发布时间】:2013-07-01 14:13:48
【问题描述】:

我希望将 BCrypt 实现到 Web 应用程序中,但是我对如何合并/更改工作/迭代/轮次的级别感到迷茫:

php.net crypt function 状态

从 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 crypt 的自适应函数。随着时间的推移,可以增加轮数以使其变慢,因此尽管计算技术更快,但它仍然可以抵抗暴力攻击。

所以我的问题是,如何减慢或加快密码有效性检查?或者以另一种方式,如何设置创建哈希密码所需的默认迭代次数?

【问题讨论】:

  • crypt() 函数将不会为您生成随机盐。不过,PHP 5.5 有一个名为 password_hash() 的新函数,它将处理所有内容并自动生成安全的盐。在内部它将调用 crypt() 函数。请改用password_hash(),对于早期的PHP 版本也存在compatibility pack

标签: php cryptography bcrypt crypt


【解决方案1】:

这里有一个解决方案:

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 以获得更全面的答案:

【讨论】:

    【解决方案2】:

    这一切都在documentation 中。这种情况下的盐值必须是

    “$2y$”,两位数的成本参数,“$”,以及 22 个字符 字母“./0-9A-Za-z”。使用超出此范围的字符 salt 将导致 crypt() 返回一个长度为零的字符串。两位数 成本参数是迭代次数的以 2 为底的对数 底层基于 Blowfish 的散列算法,必须在范围内 04-31,超出此范围的值将导致 crypt() 失败。

    所以对于 1024 (2^10) 轮,调用应该是

    crypt($user_input, "$2y$10$......................");
    

    其中每个. 代表合法字母表中的一个盐字符。将参数10 增加/减少一倍/减半轮数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2017-10-28
      • 2018-07-27
      • 2011-05-25
      • 2019-01-24
      相关资源
      最近更新 更多