Symfony2 utwórz własny koder do przechowywania hasła

Jestem nowy w Symfony2 i mam może proste pytanie dotyczące kodowania haseł użytkowników w moim DB.

Chciałbym zakodować i zapisać w DB hasło moich użytkowników w ten sposób:

encoded_password = salt . sha1 ( salt . raw_password )

Znalazłem różne kodery (sha1, sha512, plaintext), widziałem, że z plaintext mam w DB raw_password{salt} , ale nadal nie czuję się komfortowo z metodą signin/login / getSalt() w Symfony2.

Jeśli mógłbyś mnie podwieźć (proszę, Załóżmy, że nie chcę używać istniejącego pakietu dla UserManagement, chciałbym zrobić własne) byłoby super!

Dzięki

EDIT:

Mógłbym to zrobić w moim signinAction ():

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

Mógłbym to zrobić w moim getSalt ():

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

Ale obecnie mam tylko to w loginAction (): (patrz tutaj: 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,
        ));
    }
}

Jak mogę powiedzieć Symfony2, aby podczas logowania sprawdzał hasło tak, jak tego potrzebuję? (cuobecnie robi kod(hasło, sól)i nie sól.encode (password,salt)

Author: guillaumepotier, 2011-10-24

3 answers

Aby to uprościć: musisz utworzyć i dodać nową usługę , dodać ją do swojego pakietu i określić, że klasa User będzie z niej korzystać. Najpierw musisz zaimplementować swój własny koder haseł :

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

}

Następnie dodasz definicję usługi i chcesz określić do użyj własnego kodera dla klasy User. W TestBundle / Resources/config / services.yml dodajesz własny koder:

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

I w app / config / security.yml możesz zatem określić swoją klasę jako domyślny koder (dla klasy Acme\TestBundle\Entity\User):

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

Oczywiście salt odgrywa kluczową rolę w szyfrowaniu haseł. Sól jest unikalna i jest przechowywana dla każdego użytkownika. Klasa User może być automatycznie wygenerowana przy użyciu adnotacji YAML (tabela powinna-oczywiście-zawierać pola username, password, salt itd.) i powinna zaimplementować UserInterface.

Wreszcie możesz go użyć (kod kontrolera), gdy musisz utworzyć nowy 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);
 48
Author: gremo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 19:24:56

Dziękuję gremo, jest mały problem w ostatnim fragmencie kodu, podczas korzystania z usługi powinniśmy umieścić jego nazwę "sha256salted_encoder", a nie acme.test.sha256salted_encoder. dodatkowo

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

Najpierw wywołamy koder bezpieczeństwa, potem znajdziemy

Sha256salted_encoder

I serwis będzie przydatny.

All the best

 2
Author: sami boussacsou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 10:43:13

Zasadniczo, powinieneś / musisz używać tylko kodera bcrypt, aby bezpiecznie przechowywać hasło w bazie danych.

Oto dlaczego:

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

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

Aby skonfigurować ten koder należy edytować swoje zabezpieczenia.plik yml

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

Ten koder jest używany wewnątrz klasy UserPasswordEncoder, którą można znaleźć tutaj: Symfony\Component\Security\Core\Encoder

 -1
Author: Benoît,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-26 08:28:46