【问题标题】:Symfony2 create own encoder for storing passwordSymfony2 创建自己的编码器来存储密码
【发布时间】:2011-10-24 16:38:19
【问题描述】:

我是 Symfony2 的新手,我可能有一个关于在我的数据库中编码我的用户密码的简单问题。

我想以这种方式对我的用户密码进行编码并存储在数据库中:

encoded_password = salt . sha1 ( salt . raw_password )

我找到了各种编码器(sha1、sha512、明文),我看到我的数据库 raw_password{salt} 中有明文,但我仍然不习惯 Symfony2 中的 signin/login/getSalt() 方法。

如果您能帮我解决这个问题(请假设我不想将现有的捆绑包用于 UserManagement,我想自己制作),那就太棒了!

谢谢

编辑:

我可以在我的 signinAction() 中做到这一点:

$salt = substr(md5(time()),0,10);
$pwd = $encoder->encodePassword($user->getPassword(), $salt);
$user->setPassword($salt.$pwd);

我可以在我的 getSalt() 中做到这一点:

return substr($this->password,0,10);

但我目前在我的 loginAction() 中只有那个:(见这里:http://symfony.com/doc/current/book/security.html

// src/Acme/SecurityBundle/Controller/Main;
namespace Acme\SecurityBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\SecurityContext;

class SecurityController extends Controller
{
    public function loginAction()
    {
        $request = $this->getRequest();
        $session = $request->getSession();

        // get the login error if there is one
        if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
            $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
        } else {
            $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
        }

        return $this->render('AcmeSecurityBundle:Security:login.html.twig', array(
            // last username entered by the user
            'last_username' => $session->get(SecurityContext::LAST_USERNAME),
            'error'         => $error,
        ));
    }
}

如何告诉 Symfony2 在登录操作期间按照我需要的方式检查密码? (目前正在做 encode(password,salt) 而不是 salt.encode(password,salt)

【问题讨论】:

  • “我仍然对 Symfony2 中的 signin/login/getSalt() 方法不满意” - 具体是什么?很高兴知道回答您的问题。
  • 这意味着我看到了如何在我的登录控制器上实现此行为,但我目前使用 Sf2 默认 loginAction 并且不知道如何在该控制器中实现它。
  • 您指的是哪个捆绑包?
  • 嘿@hakre,我在我的问题中放了一些代码。希望它能帮助你理解我的问题。非常感谢
  • 查看我的捆绑包:github.com/elnur/ElnurBlowfishPasswordEncoderBundle。它提供真正的加密——不仅仅是散列。

标签: php security symfony hash


【解决方案1】:

为了简单起见:您必须创建并添加一个新的Service,将其添加到您的包中并指定User 类将使用它。首先,您必须实现自己的密码编码器

namespace Acme\TestBundle\Service;

use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface;

class Sha256Salted implements PasswordEncoderInterface
{

    public function encodePassword($raw, $salt)
    {
        return hash('sha256', $salt . $raw); // Custom function for password encrypt
    }

    public function isPasswordValid($encoded, $raw, $salt)
    {
        return $encoded === $this->encodePassword($raw, $salt);
    }

}

然后,您将添加服务定义,并希望为User 类指定使用您的自定义编码器。在 TestBundle/Resources/config/services.yml 中添加自定义编码器:

services:
    sha256salted_encoder:
        class: Acme\TestBundle\Service\Sha256Salted

因此,在 app/config/security.yml 中,您可以将自定义类指定为默认编码器(对于 Acme\TestBundle\Entity\User 类):

 encoders:
   Acme\TestBundle\Entity\User:
     id: acme.test.sha256salted_encoder

当然,salt 在密码加密中起着核心作用。 Salt 是唯一的,并为每个用户存储。 User 类可以使用 YAML 注释自动生成(表应该 - 当然 - 包含字段用户名、密码、盐等)并且应该实现 UserInterface

当你必须创建一个新的Acme\TestBundle\Entity\User时,你终于可以使用它(控制器代码):

// Add a new User
$user = new User();
$user->setUsername = 'username';
$user->setSalt(uniqid(mt_rand())); // Unique salt for user

// Set encrypted password
$encoder = $this->container->get('acme.test.sha256salted_encoder')
  ->getEncoder($user);
$password = $encoder->encodePassword('MyPass', $user->getSalt());
$user->setPassword($password);

【讨论】:

  • 完美!!你让我今天一整天都感觉很好!在旧解决方案和使用 sf2 的新解决方案之间迁移期间,我绝望地丢失了所有密码;)
  • 嗨,这非常适合创建帐户。但是我怎样才能登录我的用户呢?
  • 因为用户不会被认证。我该怎么做?
【解决方案2】:

谢谢gremo,你的代码最后一个sn-p有一个小问题,使用服务时我们应该把它的名字命名为“sha256salted_encoder”而不是acme.test.sha256salted_encoder。 另外

// Add a new User
$user = new User();
$user->setUsername = 'username';
$user->setSalt(uniqid(mt_rand())); // Unique salt for user

// Set encrypted password
$encoder = $this->container->get('security.encoder_factory')
  ->getEncoder($user);
$password = $encoder->encodePassword('MyPass', $user->getSalt());
$user->setPassword($password);

首先我们会调用安全编码器,然后我们会找到

sha256salted_encoder

该服务将很有用。

一切顺利

【讨论】:

    【解决方案3】:

    基本上,您应该/必须只使用 bcrypt 编码器将密码安全地存储到您的数据库中。

    原因如下:

    http://dustwell.com/how-to-handle-passwords-bcrypt.html

    http://adambard.com/blog/3-wrong-ways-to-store-a-password/

    要配置此编码器,您应该编辑您的 security.yml 文件

    security:
        encoders:
            Symfony\Component\Security\Core\User\UserInterface: bcrypt
    

    此编码器在UserPasswordEncoder 类中使用,可在此处找到:Symfony\Component\Security\Core\Encoder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      相关资源
      最近更新 更多