У меня есть устаревшая система, которая содержит хешированные пароли md5. Я проверил их правильно, и они не используют соль.
security.yml
security: encoders: Namespace\MyBundle\Entity\User: algorithm: md5 providers: entityUsers: entity: { class: NamespaceBundle:User, property: username }
В моем объекте User я реализовал UserInterface и удостоверился, что соль установлена в пустую строку .
Но при попытке аутентификации я получаю плохую учетную запись.
Я попытался переключить security.yml в открытый текст и ввел хэш, и система работает нормально.
Разумеется, md5 должен работать?
У меня была такая же проблема, и мне приходилось копаться в коде, чтобы узнать, почему.
Вам не нужно создавать собственный кодировщик.
По умолчанию кодер 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
Надеюсь это поможет