我是Symfony2的新手,我可能有一个关于在我的数据库中编码用户密码的简单问题。
我想用DB编码和存储用户密码:
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在登录操作期间以我需要的方式检查密码? (执行编码(密码,盐)而不是salt.encode(密码,盐)
答案 0 :(得分:48)
要简单起见:您必须创建并添加新的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是唯一的,并为每个用户存储。可以使用YAML注释自动生成类User
(表当然应包含用户名,密码,盐等字段)并应实现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);
答案 1 :(得分:2)
谢谢你gremo,你的代码的最后一个片段有一个小问题,当使用服务时我们应该把它的名字命名为“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
并且该服务将非常有用。
一切顺利
答案 2 :(得分:-1)
基本上,您应该/只能使用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