MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zaszyfruj pola haseł w mongodb

Zgodnie z rozmową w komentarzach masz na myśli haszowanie hasła, a nie szyfrowanie Hasła. Zwykle robisz to z solą, aby zapobiec atakowi tęczowego stołu. Przechowywanie haseł jako solonych skrótów jest najlepszym standardem, jeśli chodzi o przechowywanie haseł w bazach danych.

Od wersji 3.2 MongoDB nie ma natywnej obsługi haszowania haseł, jak to zapewniają niektóre bazy danych SQL, więc będziesz musiał zaimplementować to w Javie.

Aby wygenerować nowe konto lub zmienić hasło istniejącego konta:

  1. wygeneruj kryptograficznie bezpieczną losową wartość soli za pomocą java.security.SecureRandom . Ta klasa działa tak samo jak standardowy generator liczb losowych java.util.Random (jest to podklasa), ale zamienia wydajność na znacznie wyższy poziom nieprzewidywalności, który jest wymagany w kontekście związanym z bezpieczeństwem.
  2. Utwórz ciąg, łącząc sól i hasło
  3. Wygeneruj skrót tego ciągu za pomocą kryptograficznie bezpiecznej funkcji skrótu. Istnieje wiele funkcji skrótu dostarczanych przez Javę gotową do użycia, ale chcesz użyć takiej, która jest celowo trudna do obliczenia, aby spowolnić atakującego z dostępem do bazy danych, który próbuje wymusić skróty w lokalnym klastrze superkomputerów. Dobrym kandydatem jest algorytm „PBKDF2WithHmacSHA1”, który jest obsługiwany przez javax.crypto.SecretKeyFactory klasa.
  4. Zapisz dokument w MongoDB za pomocą pól username , password_hash i password_salt (oczywiście plus rzeczywiste dane aplikacji). Nie zapisuj oryginalnego hasła.

Aby odzyskać konto:

  1. Przeczytaj username_input i password_input domniemany użytkownik wpisał się do twojego formularza logowania.
  2. Pobierz dokument, w którym username pasuje do username_input podany przez użytkownika.
  3. Pobierz password_salt pole z tego dokumentu
  4. Utwórz ciąg, łącząc password_salt i password_input tak jak wcześniej.
  5. Wygeneruj skrót tego ciągu za pomocą tej samej kryptograficznie bezpiecznej funkcji skrótu.
  6. Porównaj hash z password_hash pole dokumentu. Gdy pasuje, użytkownik wprowadził prawidłowe hasło.

Możesz alternatywnie pobrać tylko pola password_hash i password_salt dokumentu i nie ładować reszty przed uwierzytelnieniem użytkownika, ale zakładam, że w prawdziwym świecie spowoduje to więcej obciążenia niż zaoszczędzi. Pomyślne logowania zwykle znacznie przewyższają liczebnie te nieudane, chyba że masz atakującego, który próbuje brutalnie wymusić konto. W takim przypadku zablokowałbyś atakującego za pomocą fail2ban lub inny mechanizm ograniczający logowanie.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sortowanie w MongoDB według elemMatch

  2. Zapytanie zwróciło błędny wynik przy użyciu sterownika mongdb erlang?

  3. jak ustawić mongod --dbpath

  4. Połącz się z hostem mongodb z kontenera docker

  5. Jak dodać ostatnie pole do istniejącej kolekcji dokumentów spring-data-mongodb?