【问题标题】:How to get symfony2 security BCRYPT encoder to work with php crypt() function如何让 symfony2 安全 BCRYPT 编码器与 php crypt() 函数一起使用
【发布时间】:2013-06-20 09:33:14
【问题描述】:

我正在使用 bcrypt 对我的密码进行哈希处理,但似乎 symfony2 身份验证系统不会产生与 php 的本机 crypt 函数相同的哈希值。 Bellow 是我为我的用户密码生成的盐:

 $salt = '$2y$13$' . substr(md5(uniqid(rand(), true)),0,21) . '$';
 $this->setPassword('test',$salt);

在我的 security.yml 文件中,我只是在做:

encoders:
    Blogger\BlogBundle\Entity\User:
        algorithm:  bcrypt
        iterations: 13

这两种编码方法会产生不同的哈希值有什么原因吗?我使用的库是 ircmaxell/password-compat。

【问题讨论】:

  • 请提供您用于测试 crypt 功能的代码。也许是迭代次数?
  • 什么版本的 Symfony?另外,为什么要手动设置盐?此外,你为什么以如此可怕的方式产生盐? Symfony 会为你做这件事。你为什么要让它变得比它需要的更困难?证明:Symfony's Source Code
  • 这是一种预期行为,您每次都会获得不同的哈希值,因为每次计算都会生成不同的(随机)盐。这样攻击者就无法判断两个用户是否输入了相同的密码。如果你想测试哈希,那么只需测试验证是否失败/成功。

标签: php authentication symfony passwords bcrypt


【解决方案1】:

在 Symfony2 中使用它的最佳方法是使用获取编码器。

use \Blogger\BlogBundle\Entity\User;

$user = new User();

$encoderFactory = $this->get('security.encoder_factory');
$encoder = $encoderFactory->getEncoder($user);

$salt = 'salt'; // this should be different for every user
$password = $encoder->encodePassword('password', $salt);

$user->setSalt($salt);
$user->setPassword($password);

如果你使用 FOSUserBundle,你应该使用:

use \Blogger\BlogBundle\Entity\User;

$userManager = $this->get('fos_user_manager');

$password = 'password';
$user = new User();
$user->setPlainPassword($password);

$userManager->updateUser($user, true); // second argument tells user manager to flush

【讨论】:

    【解决方案2】:

    在查看了 bcrypt 的 Symfony2.3 实现的源代码后,他们使用了一个名为 hash_algorithm() 的函数,它似乎产生了与 crypt() 不同的结果。两者都使用 $2y$ 版本的 bcrypt 并且我将两种算法的成本都设置为 13 ......但是,改为执行以下设置密码更为一致:

    $user->setPassword(password_hash($user->getPassword(), PASSWORD_BCRYPT, array('cost' => 13)));
    

    那行代码似乎解决了我的问题。最好的部分是我什至不必再生成盐了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多