MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Passwortfelder in mongodb verschlüsseln

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:

  1. Generieren Sie einen kryptografisch sicheren zufälligen Salt-Wert mit java.security.SecureRandom . Diese Klasse funktioniert genauso wie der standardmäßige Zufallszahlengenerator java.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.
  2. Erstellen Sie einen String durch Verketten von Salt und Passwort
  3. 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.
  4. Speichern Sie das Dokument mit den Feldern username in MongoDB , password_hash und password_salt (natürlich plus Ihre eigentlichen Bewerbungsdaten). Speichern Sie nicht das ursprüngliche Passwort.

So rufen Sie ein Konto ab:

  1. Lesen Sie die username_input und password_input der angebliche Benutzer in Ihr Anmeldeformular eingegeben hat.
  2. Rufen Sie das Dokument ab, in dem der username stimmt mit username_input überein vom Benutzer bereitgestellt.
  3. Holen Sie sich das password_salt Feld aus diesem Dokument
  4. Erstellen Sie einen String, indem Sie password_salt verketten und password_input genau wie du es vorher getan hast.
  5. Generieren Sie einen Hash dieser Zeichenfolge mit derselben kryptografisch sicheren Hash-Funktion.
  6. 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.