Использование MD5 в symfony2 security.yml для устаревших пользователей

У меня есть устаревшая система, которая содержит хешированные пароли md5. Я проверил их правильно, и они не используют соль.

security.yml

security: encoders: Namespace\MyBundle\Entity\User: algorithm: md5 providers: entityUsers: entity: { class: NamespaceBundle:User, property: username } 

В моем объекте User я реализовал UserInterface и удостоверился, что соль установлена ​​в пустую строку .

Но при попытке аутентификации я получаю плохую учетную запись.

Я попытался переключить security.yml в открытый текст и ввел хэш, и система работает нормально.

Разумеется, md5 должен работать?

Related of "Использование MD5 в symfony2 security.yml для устаревших пользователей"

У меня была такая же проблема, и мне приходилось копаться в коде, чтобы узнать, почему.

Вам не нужно создавать собственный кодировщик.

По умолчанию кодер MessageDigestPasswordEncoder ( Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder ) в Symfony 2.5 – и, возможно, все выпуски Symfony 2 – вычисляет хеш MD5 необработанного пароля с использованием / без использования соли, как и ожидалось, и затем повторно хеширует MD5 несколько раз (5000 раз, по умолчанию, в Symfony 2.5) . Чтобы сделать вещи немного более захватывающими, кодировщик также будет кодировать хэш-код base64 по умолчанию . Обе эти функции вызывали проблемы для меня.

Вы можете устранить проблему (проблемы), отключив повторное хеширование и / или отключив кодировку base64 в security.yml , таким образом:

 security: encoders: Namespace\Of\Your\User: algorithm: md5 encode_as_base64: false iterations: 0 

Надеюсь, что это сэкономит вам время.

Оказывается, что md5 в symfony2 по умолчанию использует соль. Там может быть более простой способ, но я только что создал пользовательский интерфейс кодировщика паролей md5, который игнорирует соль.

Зарегистрировать сервис

 namespace.project.md5password.encoder: class: Namepspace\MyBundle\Services\CustomMd5PasswordEncoder 

Создать службу кодировщика

 namespace Namespace\MyBundle\Services; use Symfony\Component\Security\Core\Encoder\PasswordEncoderInterface; class CustomMd5PasswordEncoder implements PasswordEncoderInterface { public function __construct() { } public function encodePassword($raw, $salt) { return md5($raw); } public function isPasswordValid($encoded, $raw, $salt) { return md5($raw) == $encoded; } } 

Использовать новый сервис в security.yml

 security: encoders: Namespace\MyBundle\Entity\User: id: namespace.project.md5password.encoder 

Надеюсь это поможет