Ich muss Passwörter für die Speicherung in einer Datenbank hashen. Wie kann ich das in Java machen?
Ich hatte gehofft, das Klartext-Passwort zu nehmen, ein zufälliges Salt hinzuzufügen und dann das Salt und das Hash-Passwort in der Datenbank zu speichern.
Wenn sich ein Benutzer anmelden wollte, konnte ich sein übermitteltes Passwort verwenden, das zufällige Salz aus seinen Kontoinformationen hinzufügen, es hashen und prüfen, ob es dem gespeicherten Hash-Passwort mit seinen Kontoinformationen entspricht.
java
passwords
cryptographic-hash-function
Chris Dutrow
quelle
quelle
Antworten:
Sie können dazu tatsächlich eine in die Java-Laufzeit integrierte Funktion verwenden. Das SunJCE in Java 6 unterstützt PBKDF2, einen guten Algorithmus für das Passwort-Hashing.
Hier ist eine Dienstprogrammklasse, die Sie für die PBKDF2-Kennwortauthentifizierung verwenden können:
quelle
BigInteger
: führende Nullen entfernt werden. Das ist für ein schnelles Debuggen in Ordnung, aber ich habe aufgrund dieses Effekts Fehler im Produktionscode gesehen.Hier ist eine vollständige Implementierung mit zwei Methoden, die genau das tun, was Sie wollen:
Der Punkt ist, dass die Passwörter auch dann sicher sind, wenn ein Angreifer Zugriff auf Ihre Datenbank und den Quellcode erhält.
Wir lagern
'salt$iterated_hash(password, salt)'
. Das Salt besteht aus 32 zufälligen Bytes. Wenn zwei verschiedene Personen dasselbe Passwort wählen, sehen die gespeicherten Passwörter immer noch unterschiedlich aus.Die
iterated_hash
, die im Grundehash(hash(hash(... hash(password, salt) ...)))
macht es sehr teuer für einen potentiellen Angreifer, der Zugriff auf die Datenbank zu erratende Kennwörter hat, Hash sie und schauen Hashes in der Datenbank. Sie müssen diesiterated_hash
jedes Mal berechnen, wenn sich ein Benutzer anmeldet, aber es kostet Sie nicht so viel im Vergleich zu dem Angreifer, der fast 100% seiner Zeit damit verbringt, Hashes zu berechnen.quelle
char[] password
anstelle von ändernString password
.BCrypt ist eine sehr gute Bibliothek, und es gibt einen Java-Port davon.
quelle
Sie können Hashes mit berechnen
MessageDigest
, dies ist jedoch in Bezug auf die Sicherheit falsch. Hashes dürfen nicht zum Speichern von Passwörtern verwendet werden, da sie leicht zerbrechlich sind.Sie sollten einen anderen Algorithmus wie bcrypt, PBKDF2 und scrypt verwenden, um Ihre Passwörter zu speichern. Siehe hier .
quelle
Sie können die Implementierung der von OWASP beschriebenen Shiro- Bibliothek (ehemals JSecurity ) verwenden .
Es sieht auch so aus, als hätte die JASYPT-Bibliothek ein ähnliches Dienstprogramm .
quelle
Zusätzlich zu bcrypt und PBKDF2, die in anderen Antworten erwähnt wurden, würde ich empfehlen, sich scrypt anzusehen
MD5 und SHA-1 werden nicht empfohlen, da sie relativ schnell sind. Wenn Sie also verteiltes Computing mit "Miete pro Stunde" (z. B. EC2) oder eine moderne High-End-GPU verwenden, können Sie Passwörter mithilfe von Brute-Force- / Wörterbuchangriffen zu relativ geringen Kosten und zu angemessenen Preisen "knacken" Zeit.
Wenn Sie sie verwenden müssen, wiederholen Sie den Algorithmus mindestens eine vordefinierte signifikante Anzahl von Malen (1000+).
Weitere Informationen finden Sie hier: /security/211/how-to-securely-hash-passwords
Und hier: http://codahale.com/how-to-safely-store-a-password/ (kritisiert SHA-Familie, MD5 usw. für Passwort-Hashing-Zwecke)
quelle
Stimmen Sie Erickson voll und ganz zu, dass PBKDF2 die Antwort ist.
Wenn Sie diese Option nicht haben oder nur einen Hash verwenden müssen, ist Apache Commons DigestUtils viel einfacher als der richtige JCE-Code: https://commons.apache.org/proper/commons-codec/apidocs/org/apache /commons/codec/digest/DigestUtils.html
Wenn Sie einen Hash verwenden, wählen Sie sha256 oder sha512. Diese Seite enthält gute Empfehlungen zur Behandlung und zum Hashing von Passwörtern (beachten Sie, dass für die Behandlung von Passwörtern kein Hashing empfohlen wird): http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
quelle
Obwohl die NIST-Empfehlung PBKDF2 bereits erwähnt wurde, möchte ich darauf hinweisen, dass es von 2013 bis 2015 einen öffentlichen Passwort-Hashing-Wettbewerb gab . Am Ende wurde Argon2 als empfohlene Passwort-Hashing-Funktion ausgewählt.
Es gibt eine ziemlich gut angenommene Java-Bindung für die ursprüngliche (native C) Bibliothek, die Sie verwenden können.
Im durchschnittlichen Anwendungsfall denke ich, dass es aus Sicherheitsgründen keine Rolle spielt, wenn Sie PBKDF2 anstelle von Argon2 wählen oder umgekehrt. Wenn Sie hohe Sicherheitsanforderungen haben, empfehle ich, Argon2 in Ihrer Bewertung zu berücksichtigen.
Weitere Informationen zur Sicherheit von Passwort-Hashing-Funktionen finden Sie unter security.se .
quelle
Sie können Spring Security Crypto (hat nur 2 optionale Kompilierungsabhängigkeiten ) verwenden, das die Kennwortverschlüsselung von PBKDF2 , BCrypt , SCrypt und Argon2 unterstützt .
quelle
Hier haben Sie zwei Links für MD5-Hashing und andere Hash-Methoden:
Javadoc-API: http://java.sun.com/j2se/1.4.2/docs/api/java/security/MessageDigest.html
Tutorial: http://www.twmacinta.com/myjava/fast_md5.php
quelle
Unter allen Standard-Hash-Schemata ist LDAP ssha das sicherste.
http://www.openldap.org/faq/data/cache/347.html
Ich würde einfach den dort angegebenen Algorithmen folgen und MessageDigest verwenden, um den Hash auszuführen.
Sie müssen das Salz wie vorgeschlagen in Ihrer Datenbank speichern.
quelle
Ab 2020 ist der glaubwürdigste und flexibelste verwendete Algorithmus
derjenige, der seine Stärke bei jeder Hardware am wahrscheinlichsten optimiert,
ist Argon2id oder Argon2i .
Es bietet das erforderliche Kalibrierungswerkzeug, um optimierte Festigkeitsparameter unter Berücksichtigung einer Ziel-Hashing-Zeit und der verwendeten Hardware zu finden.
Speichergieriges Hashing würde gegen die Verwendung von GPUs zum Knacken helfen.
Die Implementierung von Spring Security / Bouncy Castle ist nicht optimiert und relativ wochenlang, wenn man bedenkt, was der Angreifer verwenden könnte. Vgl.: Federdokumentation
Die glaubwürdigste Implementierung, die für Java verwendet wird, ist die von mkammerer .
ein Wrapper-Glas / eine Bibliothek der offiziellen nativen Implementierung, die in Rust geschrieben wurde.
Es ist gut geschrieben und einfach zu bedienen.
Die eingebettete Version bietet native Builds für Linux, Windows und OSX.
Als Beispiel wird es von jpmorganchase in seinem Tessera- Sicherheitsprojekt verwendet, das zur Sicherung von Quorum , seiner Cryptocurency-Implementierung von Ethereum, verwendet wird.
Hier ist der Beispielcode von tessera.
Die Kalibrierung kann mit de.mkammerer.argon2.Argon2Helper # findIterations durchgeführt werden
Der SCRYPT- und Pbkdf2-Algorithmus kann auch durch Schreiben eines einfachen Benchmarks kalibriert werden. Aktuelle minimale sichere Iterationswerte erfordern jedoch höhere Hashing-Zeiten.
quelle
Ich habe das aus einem Video auf udemy abgeleitet und bearbeitet, um ein stärkeres zufälliges Passwort zu erhalten
quelle