我正在使用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)));
那行代码似乎解决了我的问题。最棒的是,我甚至不再需要生成盐了。