Кодирование и декодирование паролей с использованием Spring Security, Spring Boot и MongoDB
Я использую упомянутый выше программный стек, и мне нужно зашифровать пароль перед сохранением в базе данных. Мне также нужно расшифровать пароль, потому что, когда кто-то изменит пароль, он должен дать старый пароль, а затем новый onw дважды, и мне нужно проверить старый пароль. Я искал много, но я все еще не уверен, что это правильный способ сделать это. Я нашел эту ссылку шифровать но есть ли другие подсказки, чтобы сделать это? Я также не уверен, может быть, MongoDB предоставляет что-то для защиты паролей.
2 ответов
впервые прочитала Стивен Карлсон отвечает о хэширования паролей.
хорошо, что Spring Security сделает это за вас. Spring Security 3.2 представила новый org.springframework.security.crypto.password.PasswordEncoder
интерфейс и некоторые реализации: BCryptPasswordEncoder
, StandardPasswordEncoder
(и NoOpPasswordEncoder
).
важно: не путайте org.springframework.security.
crypto.password
.PasswordEncoder
со старым устаревшим org.springframework.security.
authentication.encoding
.PasswordEncoder
интерфейс (и, следовательно, реализации) имеет два метода вам нужно:
public String encode(CharSequence rawPassword)
public boolean matches(CharSequence rawPassword, String encodedPassword)
я рекомендую использовать org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
.
The BCryptPasswordEncoder
(в отличие от StandardPasswordEncoder
) используйте соль, которая отличается для каждого пароля (но не глобальная, как у StandardPasswordEncoder
). При кодировании необработанного пароля (public String encode(CharSequence rawPassword)
), то результирующий зашифрованный пароль это не просто закодированный пароль, он также содержит некоторую мета-информацию об используемом хэш-алгоритме, используемой соли и, конечно, закодированном пароле.
вы не должны "шифровать" пароль вообще. Я знаю, это звучит противоречиво. Но есть нулевая причина, по которой система должна расшифровать пароль. Это откроет вашу базу данных хакеру, потому что, если вы сохраните пароль для дешифрования в своих кодах/сервере, хакер может украсть эту информацию.
правильный процесс-это hash
пароль. Хэш-это односторонний (не может быть расшифрован обратно в исходный текст) процесс. Нынешний стандарт используйте SHA256 для хэширования пароля. Вот базовая схема:
- возьмите пароль пользователя. Пример пароля "mypass" будет хэшировать до
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
- Сохраните этот хэш (
ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
) в базе данных.
при входе пользователя в взять пароль, он просто представил и хэш. Если он введет тот же пароль, он будет хэшировать то же значение в вашей базе данных.
когда пользователь переходит поменять пароли хэшировать "введите свой старый пароль", чтобы убедиться, что старый пароль все еще соответствует, Если вы хэшируете" введите свой новый пароль " и сохраните его.
одна вещь, которую я не упомянул в моем примере salt
. Это то, что вы должны использовать в своей системе, поскольку она защищает ваши данные от rainbow table
подвиги. Но это для другого обсуждения.
надеюсь, что это помогает :)