Symfony2安全性:在代码中使用加密设置

时间:2015-01-09 11:11:27

标签: php security symfony encryption password-encryption

我使用security.yml配置密码加密:

encoders:
    Acme\UserBundle\Entity\User:
        algorithm: bcrypt
        cost: 10

现在我想在我的用户实体中更新用户密码,所以在Entity \ User.php的某处我应该有类似的东西:

$this->password = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]);

但是,让我们想象有时会有人决定将加密成本值更改为20并更新security.yml。很容易忘记自定义加密代码。

我可以在我的代码中使用security.yml中的设置来使解决方案更加通用且更友好吗?

2 个答案:

答案 0 :(得分:1)

直接从security.yml中删除东西有点挑战,你真的不想这样做。您可以使用安全系统使用的相同密码编码器。

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

$encoder = $encoderFactory->getEncoder($user);

$passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt());

可以考虑查看FOSUserBundle UserManager类。它有一些有用的技术。

答案 1 :(得分:0)

您不应在实体内手动编码密码。更好的方法是让实体完全不可知,并将编码结果传递给setPassword()

然而,您仍然可以在实体外部手动执行此操作,例如在服务中,并且在这种情况下,最好从容器中获取密码编码器工厂服务(或者更好地注入它),而不是尝试重现算法你自己:

$encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
$user->setPassword($encoder->encodePassword('p4ssw0rd', $user->getSalt()));

此外,使用Bcrypt的另一个好处是您可以随时更改成本,而无需担心同时更新数据库中的所有密码。它仍然可以使用旧设置检查密码,例如,您可以在下次登录时使用更强的安全设置更新数据库中的密码。