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:
- wygeneruj kryptograficznie bezpieczną losową wartość soli za pomocą
java.security.SecureRandom
. Ta klasa działa tak samo jak standardowy generator liczb losowychjava.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. - Utwórz ciąg, łącząc sól i hasło
- 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. - Zapisz dokument w MongoDB za pomocą pól
username
,password_hash
ipassword_salt
(oczywiście plus rzeczywiste dane aplikacji). Nie zapisuj oryginalnego hasła.
Aby odzyskać konto:
- Przeczytaj
username_input
ipassword_input
domniemany użytkownik wpisał się do twojego formularza logowania. - Pobierz dokument, w którym
username
pasuje dousername_input
podany przez użytkownika. - Pobierz
password_salt
pole z tego dokumentu - Utwórz ciąg, łącząc
password_salt
ipassword_input
tak jak wcześniej. - Wygeneruj skrót tego ciągu za pomocą tej samej kryptograficznie bezpiecznej funkcji skrótu.
- 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.