2012-03-30 4 views
1

Мне нужно сравнить введенный пользователем пароль, если он действителен или нет. Как получить шифрование sha512. Я также использую FOSUserBundle в своем проекте.Symfony2: Как я могу генерировать хэш пароля sha512?

+2

Взгляните на мой [Комплект кодировщика паролей Blowfish] (https://github.com/elnur/ElnurBlowfishPasswordEncoderBundle). –

+0

Эй, спасибо за эту ссылку. Здорово. Попробуем. – VishwaKumar

+0

В качестве варианта вы можете получить экземпляр кодировщика и использовать его метод кодирования. Посмотрите на класс кодировщика в этом ответе http://stackoverflow.com/a/18291974/251735 – Jekis

ответ

9

В контроллере вы можете сделать (при условии, что вы установили SHA512 как алгоритм кодирования в app/config/security.yml)

$userName = 'username'; 
    $password = "pass"; 
    $userManager = $this->get('fos_user.user_manager'); 
    $user = $userManager->loadUserByUsername($userName); 
    $encoder = $this->get('security.encoder_factory')->getEncoder($user); 
    $encodedPass = $encoder->encodePassword($password, $user->getSalt()); 
    echo $user->getPassword() === $encodedPass; 
+0

Мне просто интересно, какая логика будет, если я хочу проверить пароль пользователя, даже если он вошел в систему, в случае перенаправления его на какую-то защищенную страницу. Итак, как происходит сравнение паролей в этом сценарии. Спасибо @ m2mdas – VishwaKumar

+0

Вы можете проверить [this] (http://kriswallsmith.net/post/15994931191/symfony2-security-voters) статью. Не пробовал, хотя. –

+0

Очень полезная статья. Спасибо! – VishwaKumar

1

Если вы уверены, что это SHA512 вам нужно, попробуйте this.

+1

Я пробовал это, но не получил правильного хэша как-то! Я думаю, что FOSUserBundle использует соль для кодирования паролей. – VishwaKumar

1

Symfony имеет несколько различных способов хранения паролей. Логика для хэширования и проверки пароля хранится в нескольких "Encoder" classes:

Какой используется can be configured in security.yml под ключом encoder. Если это говорит sha512, вы используете MessageDigestPasswordEncoder.

Тип кодировщика может отличаться для разных типов пользователей. Чтобы получить правильный кодер для пользователя, вы можете задать EncoderFactory. Это уже сделано для вас в UserPasswordEncoder: вы передаете пользователю и простой пароль UserPasswordEncoder->isPasswordValid, и он проверяет пароль с правильным кодировщиком, принадлежащим этому пользователю. Это самый простой интерфейс для проверки пароля пользователя.

Если вы действительно хотите знать, как работает хеширование SHA512, вы можете проверить MessageDigestPasswordEncoder. Это combines the salt and password в строке типа "password {salt}". Он вычисляет хэш этого string 5000 times. Это делается для того, чтобы сделать хеш-пароль медленным, поэтому его нелегко переборщить.

При проверке, действительно ли пароль, it uses hash_equals. Это сравнение по постоянному времени, которое предотвращает временные атаки на хэш-код пароля.

Смежные вопросы