использование кодировщика sha512 с провайдером безопасности symfony2 in_memory

Я пытаюсь настроить свое приложение symfony2 для использования кодировщика паролей sha512 с поставщиком безопасности in_memory, но я не могу заставить его работать. Я получаю печально известную ошибку «Неверные учетные данные» при входе в систему. В отличие от большинства вопросов здесь, я не хочу получать пользователей из какой-либо базы данных. Я не хочу использовать FOSUserBundle. Все, что я хочу, это просто заменить открытые пароли в моем файле security.yml хэшами sha512.

Согласно http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password это должно быть так же просто, как установить кодировщик и заменить пароль в виде открытого текста на хеш, вот что я пытался сделать:

безопасность.yml:

security:
    encoders:
        Symfony\Component\Security\Core\User\User: sha512

    providers:
        in_memory:
            memory:
                users:
                    admin: { password: $6$randomsalt$mbd3sS15ibE.W7hkLqfQ0LNEQsUod7BOUD67g/oIb8uhqGfyAzaga3vgGaRJZn67VdHHfn.tnkKY9ffDVXw3C., roles: [ 'ROLE_ADMIN' ] }

Пароль — «admin», соль — «randomsalt», а хэш сгенерирован mkpasswd:

mkpasswd -m sha-512 admin randomsalt

Почему это не работает? Ожидает ли symfony2, что хэш будет в каком-то другом формате?

РЕДАКТИРОВАТЬ: вещи, которые я пробовал:

  • создание хэша через PHP с использованием crypt($password, "$6$".$salt)
  • переключение encode_as_base64 true/false на кодировщике безопасности
  • указание количества итераций для использования (по умолчанию 5000)

Результат тот же: "Неправильные учетные данные".


person Rob    schedule 24.05.2014    source источник
comment
Я не совсем понимаю, зачем вам использовать mkpasswd в этой ситуации? Кроме того, вам может понадобиться использовать php и функцию sha512 для генерации хэша пароля, а не вызывать mkpasswd?   -  person tftd    schedule 24.05.2014
comment
Я использовал mkpasswd как быстрый способ сгенерировать хэши формата по умолчанию для тестирования. Я также пробовал использовать хэши, сгенерированные php: crypt($password, "$6".$salt) (комментарий отредактирован для краткости кода)   -  person Rob    schedule 24.05.2014


Ответы (2)


После долгих проб и ошибок единственная конфигурация, которую я смог заставить работать, - это самый простой случай:

security:
    encoders:
        Symfony\Component\Security\Core\User\User:
            algorithm: sha512
            encode_as_base64: false
            iterations: 1

    providers:
        in_memory:
            memory:
                users:
                    admin: { password: c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec, roles: [ 'ROLE_ADMIN' ] }

Это одна итерация sha512 несоленого пароля, полученного echo -n admin | sha512sum или любым из различных онлайн-генераторов хэшей. Я не могу заставить его работать с чем-либо, созданным стандартными функциями PHP crypt() или password_hash(). В документах не указан формат. Мое приложение никаким другим образом не работает с пользователями или паролями, и я скорее надеялся использовать компонент безопасности symfony без написания собственных пользовательских сущностей или кодировщиков паролей. Это превращается в ужасно много работы для того, что кажется очень простым.

person Rob    schedule 25.05.2014
comment
Я только что читал symfony.com/doc/current/ cookbook/security/, где они приводят пример с sha512. Похоже, что пароль закодирован с помощью base64 перед хешированием. Вот почему хэши не работали. - person tftd; 25.05.2014
comment
Да, также кажется, что что-то происходит с фигурными скобками в конкатенации пароля + соли. Эта запись в поваренной книге говорит, что вам нужно немного поработать. Я сдался и вместо этого выбрал bcrypt, используя ircmaxell/password-compat из github.com/ircmaxell/password_compat согласно инструкциям с symfony.com/ doc/current/book/ и это работает. Однако для этого требуется PHP ›= 5.3.7, поэтому блоки Debian Squeeze не поддерживаются. Я могу жить с этим. Спасибо! - person Rob; 25.05.2014
comment
Этот ответ работает, но обязательно заключайте хэш в кавычки, иначе yaml может распознать его как число, когда оно начинается с цифр. - person Jeroen Fiege; 20.01.2015

Я нашел решение, которое не элегантно, но работает и допускает любое количество итераций, в отличие от принятого ответа:

Он использует следующий класс: Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder.

В любом контроллере (или любом другом файле php) добавьте следующий код:

use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;

...

$messageDigestPasswordEncoder= new MessageDigestPasswordEncoder;
var_dump($messageDigestPasswordEncoder); // you'll see the default options
var_dump($messageDigestPasswordEncoder->encodePassword('Hello', '')); // ouput the encoded password

В файле security.yml добавьте следующий код:

безопасность:

encoders:
    Symfony\Component\Security\Core\User\User: sha512

providers:
    admin:
        memory:
            users:
                # password: Hello
                test:  { password: CYvx/IlZCmwdywJkE8X6FTAixdgaL1oq0u8Ij3o+2LIAyDkWHynQ5UCdWe78YQt5j4oMIIu7YjYYR2b3H7zbvg==, roles: 'ROLE_ADMIN' }
person Xavier13    schedule 28.11.2014