Passwortfelder in mongodb verschlüsseln

8

Ich habe folgenden Code, fügen Sie die userName und password in die Datenbank ein aber das Passwort wird im Nur-Text-Format gespeichert. Ich meine, wenn ich in die db schaue, kann ich das eingefügte Passwort sehen.

Ich möchte password in encrypted format

speichern %Vor%

Wie kann ich das erreichen?

    
PVH 09.03.2015, 06:23
quelle

1 Antwort

14

Laut der Konversation in den Kommentaren meinen Sie hashing Passwörter, nicht verschlüsselnde Passwörter. Normalerweise würden Sie dies mit einem Salz tun, um einen Regenbogen-Tischangriff zu verhindern. Das Speichern von Kennwörtern als gesalzene Hashes ist der Best Practice-Standard, wenn es darum geht, Kennwörter in Datenbanken zu speichern.

Ab Version 3.2 hat MongoDB keine native Unterstützung für das Hashing von Kennwörtern, wie es einige SQL-Datenbanken bieten, daher müssen Sie es in Java implementieren.

Um ein neues Konto zu erstellen oder das Passwort eines bestehenden Kontos zu ändern:

  1. generiert mit java.security.SecureRandom einen kryptographisch sicheren zufälligen Salt-Wert . Diese Klasse funktioniert genau wie der Standard-Zufallsgenerator java.util.Random ( Es handelt sich um eine Unterklasse, aber es handelt sich um eine Trades-Performance mit einem viel höheren Grad an Nicht-Vorhersagbarkeit, die für einen sicherheitsrelevanten Kontext erforderlich ist.
  2. Erstellen Sie eine Zeichenfolge durch Verketten von salt und Passwort
  3. Erzeugen Sie einen Hash dieser Zeichenfolge mit einer kryptografisch sicheren Hash-Funktion. Es gibt viele Hash-Funktionen, die von Java sofort bereitgestellt werden, aber Sie möchten eine solche 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 der javax.crypto.SecretKeyFactory Klasse.
  4. Speichern Sie das Dokument in MongoDB mit den Feldern username , password_hash und password_salt (natürlich auch Ihre eigentlichen Anwendungsdaten). Speichern Sie das ursprüngliche Passwort nicht.

So rufen Sie ein Konto ab:

  1. Lies die username_input und password_input , die der vermeintliche Benutzer in dein Login-Formular eingegeben hat.
  2. Abrufen des Dokuments, in dem username mit dem vom Benutzer bereitgestellten username_input übereinstimmt.
  3. Holen Sie sich das Feld password_salt aus diesem Dokument
  4. Erstellen Sie eine Zeichenfolge, indem Sie password_salt und password_input genau wie zuvor verketten.
  5. Erzeugt einen Hash dieser Zeichenfolge mit der gleichen kryptografisch sicheren Hash-Funktion.
  6. Vergleichen Sie den Hash mit dem Feld password_hash des Dokuments. Wenn es übereinstimmt, hat der Benutzer das richtige Passwort eingegeben.

Sie könnten alternativ auch nur die Felder password_hash und password_salt des Dokuments abrufen und nicht den Rest laden, bevor der Benutzer authentifiziert wird, aber ich würde annehmen, dass es in der realen Welt mehr Last verursacht, als es speichern würde. Erfolgreiche Logins sind in der Regel weitaus häufiger als die nicht erfolgreichen Logins, es sei denn, Sie haben einen Angreifer, der versucht, einen Account zu erzwingen. Und in diesem Fall würden Sie den Angreifer mit fail2ban oder einem anderen Mechanismus zur Beschränkung der Anmeldung blockieren.

    
Philipp 09.03.2015, 08:36
quelle