Зашифровать пароль в MongoDB
у меня есть следующий код, его вставляем userName
и password
в базе данных
но пароль хранится в текстовом формате. Я имею в виду, когда я посмотрю в БД, я вижу вставленный пароль.
Я хочу в магазине password
на
1 ответов
согласно разговору в комментариях, что вы имеете в виду хеширования пароли, а не шифровать пароли. Обычно вы делаете это с солью, чтобы предотвратить атаку радужного стола. Хранение паролей в виде соленых хэшей является лучшим стандартом практики, когда дело доходит до хранения паролей в базах данных.
начиная с версии 3.2, MongoDB не имеет собственной поддержки хэширования паролей, как некоторые базы данных SQL, поэтому вам придется реализовать его в Java.
создать новую учетную запись или изменить пароль существующей учетной записи:
- генерировать криптографически безопасное случайное значение соли с
java.security.SecureRandom
. Этот класс работает так же, как стандартный генератор случайных чисел!--28-->java.util.Random
(это подкласс), но торгует производительностью для гораздо более высокого уровня непредсказуемости, который требуется для контекста, связанного с безопасностью. - создать строку сцепление соль и пароль
- создайте хэш этой строки с криптографически безопасной хэш-функцией. Существует много хэш-функций, предоставляемых Java out-of-the-box, но вы хотите использовать тот, который намеренно трудно вычислить, чтобы замедлить злоумышленника с доступом к базе данных, пытающегося грубо заставить ваши хэши на их локальном кластере суперкомпьютеров. Хорошим кандидатом является алгоритм "PBKDF2WithHmacSHA1", который поддерживается
javax.crypto.SecretKeyFactory
класса. - сохранить документ в MongoDB с поля!--3-->,
password_hash
иpassword_salt
(плюс фактические данные приложения, конечно). Не сохраняйте исходный пароль.
чтобы получить учетную запись:
- читать
username_input
иpassword_input
предполагаемый пользователь вошел в вашу форму входа. - получить документ, где
username
соответствуетusername_input
пользователю предоставляется. - скачать
password_salt
поле из этого документа - создать строка путем объединения
password_salt
иpassword_input
так же, как и раньше. - создайте хэш этой строки с той же криптографически безопасной хэш-функцией.
- сравните хэш с
password_hash
поле документа. Когда он совпадает, пользователь ввел правильный пароль.
вы можете альтернативно получить только поля password_hash и password_salt документа и не загружать остальные до аутентификации пользователя, но я предположим, что в реальном мире это вызовет больше нагрузки, чем сэкономит. Успешные логины обычно значительно превосходят неудачные, если только у вас нет злоумышленника, который пытается заставить учетную запись. И в этом случае вы заблокируете атакующего кроме того, fail2ban или другой механизм ограничения входа в систему.