Как использовать SHA-512 с o.s.s.crypto.password.StandardPasswordEncoder?

Мне нужно использовать SHA-512 в моем коде для хеширования паролей.

Теперь я использую o.s.s.authentication.encoding.PasswordEncoder, пока он инициализирован на ShaPasswordEncoder(512).

Кроме того, o.s.s.authentication.encoding.PasswordEncoder поддерживает метод String encodePassword(String rawPass, Object salt), который позволяет хранить соль отдельно от пароля.

К сожалению, o.s.s.authentication.encoding.PasswordEncoder устарел.

Кроме того, o.s.s.crypto.password.StandardPasswordEncoder поддерживает только SHA-256.

Вдобавок это последний класс и не позволяет его перегрузка поддерживать SHA-512.

Как использовать SHA-512 с o.s.s.crypto.password.StandardPasswordEncoder? Почему нет общедоступного метода, позволяющего передавать соль, хранящуюся извне?


person Michael    schedule 18.08.2014    source источник


Ответы (1)


Что ж, я должен признать, что это не самая связная часть в Spring Security ... DaoAuthenticationProvider.getPasswordEncoder() возвращает o.s.s.authentication.encoding.PasswordEncoder, который устарел в соответствии с javadoc!

Хитрость в том, что DaoAuthenticationProvider.getPasswordEncoder() принимает объект в качестве параметра, и этот объект может быть o.s.s.authentication.encoding.PasswordEncoder ... но не пытайтесь получить!

Насколько я понимаю, o.s.s.crypto.password.StandardPasswordEncoder - это пример со средней безопасностью и фиксированным SHA-256. Если вам нужен более высокий уровень безопасности, вы можете использовать o.s.s.crypto.password.BCryptPasswordEncoder, который использует надежный алгоритм BCrypt с настраиваемым уровнем. После просмотра источников я могу подтвердить, что оба используют соль и хранят ее внутри зашифрованного пароля.

Возможно, кто-нибудь из команды Spring Security сможет объяснить причины этого (неоспоримого) выбора, касающегося невозможности изменить алгоритм дайджеста, но я не могу; возможно, это просто потому, что для использования SHA достаточно придерживаться (не устаревшего) ShaPasswordEncoder. Я просто отметил это замечание в StandardPasswordEncoder: Если вы разрабатываете новую систему, BCryptPasswordEncoder - лучший выбор как с точки зрения безопасности, так и с точки зрения взаимодействия с другими языками.

Итак, либо вы следуете совету автора StandardPasswordEncoder и используете напрямую BCryptPasswordEncoder, либо вам придется накатить свой собственный.

Достаточно скопировать источник StandardPasswordEncoder, придерживаться пакета org.springframework.security.crypto.password, потому что есть частный импорт пакетов, и изменить конструктор 2 аргументов, чтобы он был общедоступным, как:

public ConfigurablePasswordEncoder(String algorithm, CharSequence secret) { ... }

Все это скорее набор обходных путей, чем чистое решение, но я никогда не находил лучшего способа!

В заключение я бы сказал, что только интерфейс o.s.s.authentication.encoding.PasswordEncoder устарел, потому что он хранит соль вне закодированного пароля. Поэтому его не следует использовать для дальнейшей разработки кодировщиков паролей. Но его классы реализации не являются устаревшими (ни в последней версии выпуска 3.2, ни в 4.0.0M2), и вы можете спокойно продолжать использовать ShaPasswordEncoder, если он соответствует вашим требованиям.

person Serge Ballesta    schedule 20.08.2014