Кодирование и декодирование паролей с использованием Spring Security, Spring Boot и MongoDB

Я использую упомянутый выше программный стек, и мне нужно зашифровать пароль перед сохранением в базе данных. Мне также нужно расшифровать пароль, потому что, когда кто-то изменит пароль, он должен дать старый пароль, а затем новый onw дважды, и мне нужно проверить старый пароль. Я искал много, но я все еще не уверен, что это правильный способ сделать это. Я нашел эту ссылку шифровать но есть ли другие подсказки, чтобы сделать это? Я также не уверен, может быть, MongoDB предоставляет что-то для защиты паролей.

2 ответов


впервые прочитала Стивен Карлсон отвечает о хэширования паролей.

хорошо, что Spring Security сделает это за вас. Spring Security 3.2 представила новый org.springframework.security.crypto.password.PasswordEncoder интерфейс и некоторые реализации: BCryptPasswordEncoder, StandardPasswordEncoderNoOpPasswordEncoder).

важно: не путайте 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 для хэширования пароля. Вот базовая схема:

  1. возьмите пароль пользователя. Пример пароля "mypass" будет хэшировать до ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222
  2. Сохраните этот хэш (ea71c25a7a602246b4c39824b855678894a96f43bb9b71319c39700a1e045222) в базе данных.

при входе пользователя в взять пароль, он просто представил и хэш. Если он введет тот же пароль, он будет хэшировать то же значение в вашей базе данных.

когда пользователь переходит поменять пароли хэшировать "введите свой старый пароль", чтобы убедиться, что старый пароль все еще соответствует, Если вы хэшируете" введите свой новый пароль " и сохраните его.

одна вещь, которую я не упомянул в моем примере salt. Это то, что вы должны использовать в своей системе, поскольку она защищает ваши данные от rainbow table подвиги. Но это для другого обсуждения.

надеюсь, что это помогает :)