【问题标题】:Symfony2 Security: Using encryption settings in codeSymfony2 安全性:在代码中使用加密设置
【发布时间】:2015-01-09 11:11:26
【问题描述】:

我使用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 中的设置来使解决方案更通用和更易于更改吗?

【问题讨论】:

    标签: php security symfony encryption password-encryption


    【解决方案1】:

    直接从 security.yml 中提取内容有点挑战性,而且您真的不想这样做。您可以使用与安全系统相同的密码编码器。

    $encoderFactory = $this->get('security.encoder_factory');
    
    $encoder = $encoderFactory->getEncoder($user);
    
    $passwordEncrypted = $encoder->encodePassword($passwordPlaintext,$user->getSalt());
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 2011-06-29
        • 2014-07-24
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多