Muszę haszować hasła do przechowywania w bazie danych. Jak mogę to zrobić w Javie?
Miałem nadzieję, że wezmę hasło w postaci zwykłego tekstu, dodam losową sól, a następnie przechowam sól i zaszyfrowane hasło w bazie danych.
Następnie, gdy użytkownik chciał się zalogować, mogłem wziąć przesłane przez niego hasło, dodać losową sól z informacji o jego koncie, zaszyfrować ją i sprawdzić, czy jest równa zapisanemu hasłu z informacjami o koncie.
java
passwords
cryptographic-hash-function
Chris Dutrow
źródło
źródło
Odpowiedzi:
Aby to zrobić, możesz użyć funkcji wbudowanej w środowisko wykonawcze Java. SunJCE w Javie 6 obsługuje PBKDF2, który jest dobrym algorytmem do haszowania haseł.
Oto klasa narzędzi, której możesz użyć do uwierzytelnienia hasła PBKDF2:
źródło
BigInteger
: zera wiodące są usuwane. To jest ok do szybkiego debugowania, ale widziałem błędy w kodzie produkcyjnym z powodu tego efektu.Tutaj jest pełna implementacja z dwiema metodami, które robią dokładnie to, co chcesz:
Chodzi o to, że nawet jeśli atakujący uzyska dostęp zarówno do bazy danych, jak i kodu źródłowego, hasła są nadal bezpieczne.
Przechowujemy
'salt$iterated_hash(password, salt)'
. Sól to 32 losowe bajty, a jej celem jest to, że jeśli dwie różne osoby wybiorą to samo hasło, przechowywane hasła będą nadal wyglądać inaczej.To
iterated_hash
, co jest w zasadziehash(hash(hash(... hash(password, salt) ...)))
bardzo kosztowne dla potencjalnego napastnika, który ma dostęp do Twojej bazy danych, aby odgadnąć hasła, haszować je i wyszukiwać skróty w bazie danych. Musisz to obliczać zaiterated_hash
każdym razem, gdy loguje się użytkownik, ale nie kosztuje to dużo w porównaniu z atakującym, który spędza prawie 100% swojego czasu na obliczaniu skrótów.źródło
char[] password
zamiastString password
.BCrypt to bardzo dobra biblioteka i istnieje jej port Java .
źródło
Możesz użyć implementacji biblioteki Shiro (dawniej JSecurity ) tego, co zostało opisane przez OWASP .
Wygląda również na to, że biblioteka JASYPT ma podobne narzędzie .
źródło
Możesz obliczać skróty za pomocą
MessageDigest
, ale jest to złe z punktu widzenia bezpieczeństwa. Hashe nie mogą być używane do przechowywania haseł, ponieważ można je łatwo złamać.Do przechowywania haseł należy użyć innego algorytmu, takiego jak bcrypt, PBKDF2 i scrypt. Zobacz tutaj .
źródło
Oprócz bcrypt i PBKDF2 wspomnianych w innych odpowiedziach, poleciłbym przyjrzeć się scrypt
MD5 i SHA-1 nie są zalecane, ponieważ są stosunkowo szybkie, dlatego przy użyciu obliczeń rozproszonych typu „rent per hour” (np. EC2) lub nowoczesnej wysokiej klasy GPU można „złamać” hasła za pomocą ataków brutalnych / słownikowych przy stosunkowo niskich kosztach i rozsądnych czas.
Jeśli musisz ich użyć, to przynajmniej powtórz algorytm określoną wcześniej znaczną liczbę razy (1000+).
Zobacz tutaj, aby uzyskać więcej informacji: /security/211/how-to-securely-hash-passwords
A tutaj: http://codahale.com/how-to-safely-store-a-password/ (krytykuje rodzinę SHA, MD5 itp. Za haszowanie haseł)
źródło
W pełni zgadzam się z Ericksonem, że PBKDF2 jest .
Jeśli nie masz tej opcji lub potrzebujesz tylko użyć skrótu, Apache Commons DigestUtils jest znacznie łatwiejsze niż poprawienie kodu JCE: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html
Jeśli używasz hasha, idź z sha256 lub sha512. Ta strona zawiera dobre zalecenia dotyczące obsługi haseł i haszowania (pamiętaj, że nie zaleca haszowania do obsługi haseł): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
źródło
Możesz użyć Spring Security Crypto (ma tylko 2 opcjonalne zależności kompilacji ), który obsługuje szyfrowanie haseł PBKDF2 , BCrypt , SCrypt i Argon2 .
źródło
Choć PBKDF2 rekomendacja NIST już wspomniano, chciałbym podkreślić, że nie było publicznego hasło mieszania konkurencja , która trwała od 2013 do 2015. W końcu Argon2 została wybrana jako zalecana funkcji haszowania hasła.
Istnieje dość dobrze przyjęte powiązanie Java dla oryginalnej (natywnej biblioteki C), której możesz użyć.
W przeciętnym przypadku użycia nie sądzę, aby z punktu widzenia bezpieczeństwa miało to znaczenie, jeśli wybierzesz PBKDF2 zamiast Argon2 lub odwrotnie. Jeśli masz silne wymagania dotyczące bezpieczeństwa, polecam wziąć pod uwagę Argon2 w Twojej ocenie.
Więcej informacji na temat bezpieczeństwa funkcji mieszania haseł można znaleźć na stronie security.se .
źródło
Tutaj masz dwa linki do haszowania MD5 i innych metod haszowania:
Javadoc API: https://docs.oracle.com/javase/1.5.0/docs/api/java/security/MessageDigest.html
Samouczek: http://www.twmacinta.com/myjava/fast_md5.php
źródło
Spośród wszystkich standardowych schematów mieszania, ssha LDAP jest najbezpieczniejszym w użyciu,
http://www.openldap.org/faq/data/cache/347.html
Po prostu postępowałbym zgodnie z określonymi tam algorytmami i używał MessageDigest do wykonania skrótu.
Musisz przechowywać sól w swojej bazie danych, zgodnie z sugestią.
źródło
Od 2020 roku najbardziej wiarygodny i elastyczny algorytm w użyciu,
najbardziej prawdopodobny optymalizujący swoją wytrzymałość na jakimkolwiek sprzęcie,
jest Argon2id lub Argon2i .
Zapewnia niezbędne narzędzie kalibracyjne do znalezienia zoptymalizowanych parametrów wytrzymałościowych, biorąc pod uwagę docelowy czas mieszania i używany sprzęt.
Chciwe mieszanie pamięci pomogłoby w zapobieganiu używaniu GPU do łamania.
Wiosenna implementacja zabezpieczeń / Bouncy Castle nie jest zoptymalizowana i jest stosunkowo słaba, biorąc pod uwagę to, czego może użyć atakujący. cf: Spring Documentation
Najbardziej wiarygodną implementacją używaną w javie jest mkammerer ,
jar opakowujący / biblioteka oficjalnej natywnej implementacji napisanej w Rust.
Jest dobrze napisany i prosty w użyciu.
Wersja wbudowana zapewnia natywne kompilacje dla systemów Linux, Windows i OSX.
Na przykład jest używany przez jpmorganchase w swoim projekcie bezpieczeństwa tessera używanym do zabezpieczenia Quorum , jego implementacji kryptowaluty Ethereum.
Oto przykładowy kod z tessera.
Kalibrację można przeprowadzić za pomocą de.mkammerer.argon2.Argon2Helper # findIterations
Algorytmy SCRYPT i Pbkdf2 można również skalibrować, pisząc kilka prostych testów porównawczych, ale obecne minimalne bezpieczne wartości iteracji będą wymagały dłuższych czasów mieszania.
źródło
Oparłem to na filmie na Udemy i zredagowałem, aby było silniejsze, losowe hasło
źródło