Зашифровать пароль в MongoDB

у меня есть следующий код, его вставляем userName и password в базе данных но пароль хранится в текстовом формате. Я имею в виду, когда я посмотрю в БД, я вижу вставленный пароль.

Я хочу в магазине password на

1 ответов


согласно разговору в комментариях, что вы имеете в виду хеширования пароли, а не шифровать пароли. Обычно вы делаете это с солью, чтобы предотвратить атаку радужного стола. Хранение паролей в виде соленых хэшей является лучшим стандартом практики, когда дело доходит до хранения паролей в базах данных.

начиная с версии 3.2, MongoDB не имеет собственной поддержки хэширования паролей, как некоторые базы данных SQL, поэтому вам придется реализовать его в Java.

создать новую учетную запись или изменить пароль существующей учетной записи:

  1. генерировать криптографически безопасное случайное значение соли с java.security.SecureRandom. Этот класс работает так же, как стандартный генератор случайных чисел!--28-->java.util.Random (это подкласс), но торгует производительностью для гораздо более высокого уровня непредсказуемости, который требуется для контекста, связанного с безопасностью.
  2. создать строку сцепление соль и пароль
  3. создайте хэш этой строки с криптографически безопасной хэш-функцией. Существует много хэш-функций, предоставляемых Java out-of-the-box, но вы хотите использовать тот, который намеренно трудно вычислить, чтобы замедлить злоумышленника с доступом к базе данных, пытающегося грубо заставить ваши хэши на их локальном кластере суперкомпьютеров. Хорошим кандидатом является алгоритм "PBKDF2WithHmacSHA1", который поддерживается javax.crypto.SecretKeyFactory класса.
  4. сохранить документ в MongoDB с поля!--3-->, password_hash и password_salt (плюс фактические данные приложения, конечно). Не сохраняйте исходный пароль.

чтобы получить учетную запись:

  1. читать username_input и password_input предполагаемый пользователь вошел в вашу форму входа.
  2. получить документ, где username соответствует username_input пользователю предоставляется.
  3. скачать password_salt поле из этого документа
  4. создать строка путем объединения password_salt и password_input так же, как и раньше.
  5. создайте хэш этой строки с той же криптографически безопасной хэш-функцией.
  6. сравните хэш с password_hash поле документа. Когда он совпадает, пользователь ввел правильный пароль.

вы можете альтернативно получить только поля password_hash и password_salt документа и не загружать остальные до аутентификации пользователя, но я предположим, что в реальном мире это вызовет больше нагрузки, чем сэкономит. Успешные логины обычно значительно превосходят неудачные, если только у вас нет злоумышленника, который пытается заставить учетную запись. И в этом случае вы заблокируете атакующего кроме того, fail2ban или другой механизм ограничения входа в систему.