Laut dem Gespräch in den Kommentaren meinst du Hashing Passwörter, nicht verschlüsseln Passwörter. Normalerweise würden Sie dies mit einem Salz tun, um einen Rainbow-Table-Angriff zu verhindern. Das Speichern von Passwörtern als Salted Hashes ist der Best-Practice-Standard, wenn es um das Speichern von Passwörtern in Datenbanken geht.
Ab Version 3.2 hat MongoDB keine native Unterstützung für Passwort-Hashing, wie es einige SQL-Datenbanken bieten, also müssen Sie es in Java implementieren.
So erstellen Sie ein neues Konto oder ändern das Passwort eines bestehenden Kontos:
- Generieren Sie einen kryptografisch sicheren zufälligen Salt-Wert mit
java.security.SecureRandom
. Diese Klasse funktioniert genauso wie der standardmäßige Zufallszahlengeneratorjava.util.Random
(es ist eine Unterklasse), tauscht aber Leistung gegen ein viel höheres Maß an Nichtvorhersagbarkeit, das für einen sicherheitsrelevanten Kontext erforderlich ist. - Erstellen Sie einen String durch Verketten von Salt und Passwort
- Generieren Sie einen Hash dieser Zeichenfolge mit einer kryptografisch sicheren Hash-Funktion. Es gibt viele Hash-Funktionen, die von Java standardmäßig bereitgestellt werden, aber Sie möchten eine verwenden, die absichtlich schwer zu berechnen ist, um einen Angreifer mit Datenbankzugriff zu verlangsamen, der versucht, Ihre Hashes auf ihrem lokalen Supercomputer-Cluster zu erzwingen. Ein guter Kandidat ist der "PBKDF2WithHmacSHA1"-Algorithmus, der von
javax.crypto.SecretKeyFactory
Klasse. - Speichern Sie das Dokument mit den Feldern
username
in MongoDB ,password_hash
undpassword_salt
(natürlich plus Ihre eigentlichen Bewerbungsdaten). Speichern Sie nicht das ursprüngliche Passwort.
So rufen Sie ein Konto ab:
- Lesen Sie die
username_input
undpassword_input
der angebliche Benutzer in Ihr Anmeldeformular eingegeben hat. - Rufen Sie das Dokument ab, in dem der
username
stimmt mitusername_input
überein vom Benutzer bereitgestellt. - Holen Sie sich das
password_salt
Feld aus diesem Dokument - Erstellen Sie einen String, indem Sie
password_salt
verketten undpassword_input
genau wie du es vorher getan hast. - Generieren Sie einen Hash dieser Zeichenfolge mit derselben kryptografisch sicheren Hash-Funktion.
- Vergleichen Sie den Hash mit dem
password_hash
Feld des Dokuments. Wenn es übereinstimmt, hat der Benutzer das richtige Passwort eingegeben.
Sie könnten alternativ nur die Felder password_hash und password_salt des Dokuments abrufen und den Rest nicht laden, bevor der Benutzer authentifiziert ist, aber ich würde davon ausgehen, dass dies in der realen Welt mehr Last verursacht als spart. Erfolgreiche Anmeldungen sind den erfolglosen normalerweise weit überlegen, es sei denn, Sie haben einen Angreifer, der versucht, ein Konto mit Brute-Force-Angriffen zu erzwingen. Und in diesem Fall würden Sie den Angreifer mit fail2ban blockieren oder ein anderer Anmeldebeschränkungsmechanismus.