Symfony2 создать собственный кодер для хранения пароля - PullRequest
13 голосов
/ 24 октября 2011

Я новичок в Symfony2, и у меня, возможно, есть простой вопрос о кодировании моих паролей пользователей в моей БД.

Я бы хотел закодировать и сохранить в БД пароль моего пользователя таким образом:

encoded_password = salt . sha1 ( salt . raw_password )

Я нашел различные кодировщики (sha1, sha512, обычный текст), я видел, что с открытым текстом у меня есть в моей базе данных raw_password {salt}, но мне все еще не нравится метод signin / login / getSalt () в Symfony2.

Если бы вы могли мне помочь (пожалуйста, предположим, что я не хочу использовать существующий пакет для UserManagement, я хотел бы сделать свой собственный), это было бы УДИВИТЕЛЬНО!

Спасибо

EDIT:

Я мог бы сделать это в моем 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 проверять пароль во время входа в систему так, как мне нужно? (выполняется кодирование (пароль, соль), а не соль. код (пароль, соль)

Ответы [ 3 ]

48 голосов
/ 18 ноября 2011

Чтобы упростить задачу: вам нужно создать и добавить новый Сервис , добавить его в свой комплект и указать, что класс 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);
    }

}

Затем вы добавите определение сервиса и хотите указать использовать вашПользовательский кодер для класса UserTestBundle / 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

Конечно, соль играет центральную роль в шифровании пароля.Соль уникальна и хранится для каждого пользователя.Класс User может быть сгенерирован автоматически с использованием аннотаций YAML (таблица должна, конечно, содержать поля username, password, 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);
2 голосов
/ 23 января 2014

Спасибо, Гремо, в последнем фрагменте вашего кода есть небольшая проблема: при использовании сервиса мы должны указать его имя "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

и сервис будет полезен.

Всего наилучшего

0 голосов
/ 26 октября 2015

По сути, вы должны / должны использовать кодировщик 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...