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

如何让symfony2安全BCRYPT编码器与php crypt()函数一起工作,php,authentication,symfony,passwords,bcrypt,Php,Authentication,Symfony,Passwords,Bcrypt,我正在使用bcrypt散列我的密码,而symfony2身份验证系统似乎并没有产生与php的原生crypt函数相同的散列。下面是我为我的用户密码生成的salt: $salt = '$2y$13$' . substr(md5(uniqid(rand(), true)),0,21) . '$'; $this->setPassword('test',$salt); 在我的security.yml文件中,我只需执行以下操作: encoders: Blogger\BlogBundle\E

我正在使用bcrypt散列我的密码,而symfony2身份验证系统似乎并没有产生与php的原生crypt函数相同的散列。下面是我为我的用户密码生成的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。

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

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

这行代码似乎解决了我的问题。最好的部分是,我甚至不必再生成salt了。

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

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

这行代码似乎解决了我的问题。最好的部分是,我甚至不必再生成我的salt了。

在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

在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

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