Php Symfony2创建自己的用于存储密码的编码器
我是Symfony2的新手,我可能有一个关于在数据库中编码用户密码的简单问题 我希望以这种方式对我的用户密码进行编码并存储在DB中: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()方法 如果你能给我一个提升(请,假设我不想使用现有的捆绑包进行用户管理,我
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