如何让symfony2安全BCRYPT编码器与php crypt()函数一起工作


How to get symfony2 security BCRYPT encoder to work with php crypt() function

我正在使用bcrypt对密码进行哈希,symfony2身份验证系统似乎没有产生与php的本地crypt函数相同的哈希。Bellow是我为我的用户密码生成的salt:

 $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。

在Symfony2中使用此功能的最佳方式是使用get编码器。

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

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

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

那行代码似乎解决了我的问题。最棒的是,我甚至不再需要生成盐了。