Php Symfony2创建自己的用于存储密码的编码器

Php Symfony2创建自己的用于存储密码的编码器,php,security,symfony,hash,Php,Security,Symfony,Hash,我是Symfony2的新手,我可能有一个关于在数据库中编码用户密码的简单问题 我希望以这种方式对我的用户密码进行编码并存储在DB中: encoded_password = salt . sha1 ( salt . raw_password ) 我发现了各种编码器(sha1、SH512、明文),我在DB raw_密码{salt}中看到了明文,但我仍然不习惯使用Symfony2中的signin/login/getSalt()方法 如果你能给我一个提升(请,假设我不想使用现有的捆绑包进行用户管理,我

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

我希望以这种方式对我的用户密码进行编码并存储在DB中:

encoded_password = salt . sha1 ( salt . raw_password )
我发现了各种编码器(sha1、SH512、明文),我在DB raw_密码{salt}中看到了明文,但我仍然不习惯使用Symfony2中的signin/login/getSalt()方法

如果你能给我一个提升(请,假设我不想使用现有的捆绑包进行用户管理,我想自己开发),那就太棒了

谢谢

编辑:

我可以在我的签名中这样做()

我可以在我的getSalt()中这样做:

但目前我的loginAction()中只有这一项(请参见此处)


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

要使它变得简单:您必须创建并添加一个新的,将它添加到您的包中,并指定
用户
类将使用它。首先,您必须实现自己的密码编码器

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);
    }

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

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

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

谢谢你,gremo,在你的最后一段代码中有一个小问题,当使用该服务时,我们应该将其命名为“sha256salted_编码器”,而不是acme.test.sha256salted_编码器。 另外

// 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_编码器

这项服务将会很有用


最好的

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

原因如下:

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

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

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

“我仍然不习惯Symfony2中的signin/login/getSalt()方法”-具体是关于什么?最好知道如何回答您的问题。这意味着我看到了如何在我的Signin控制器上实现此行为,但我目前使用Sf2默认登录,不知道如何在该登录中实现。您指的是哪个捆绑包?嘿@hakre,我在我的问题中添加了一些代码。希望对y有所帮助你想了解我的问题。谢谢你查看我的包:。它提供了真正的加密-不仅仅是散列。太棒了!!你让我开心了!我在使用sf2的新旧解决方案之间迁移的过程中不顾一切地丢失了我的所有密码;)嗨,这对于创建帐户来说非常有效。但是我如何使用登录我的用户呢?因为该用户不需要进行身份验证。我怎么做?
 encoders:
   Acme\TestBundle\Entity\User:
     id: 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('acme.test.sha256salted_encoder')
  ->getEncoder($user);
$password = $encoder->encodePassword('MyPass', $user->getSalt());
$user->setPassword($password);
// 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);
security:
    encoders:
        Symfony\Component\Security\Core\User\UserInterface: bcrypt