Passwörter sollten aus offensichtlichen Sicherheitsgründen nicht im Klartext gespeichert werden: Sie müssen Hashes speichern und den Hash sorgfältig generieren, um Regenbogentabellenangriffe zu vermeiden.
Allerdings, in der Regel Sie die Anforderung haben die letzten speichern n Passwörter und minimaler Komplexität und minimalen Wechsel zwischen den verschiedenen Passwörter zu erzwingen (um den Benutzer zu verhindern , dass unter Verwendung einer Sequenz wie Password_1, Password_2, ..., Password_ n ). Dies wäre mit Klartext-Passwörtern trivial, aber wie können Sie das tun, indem Sie nur Hashes speichern?
Mit anderen Worten: Wie ist es möglich, einen sicheren Passwortverlaufsmechanismus zu implementieren?
Antworten:
Speichern Sie die Hashes und verifizieren Sie ein eingegebenes Passwort anhand dieser gespeicherten Hashes, genauso wie Sie ein Passwort beim Anmelden verifizieren. Sie müssten alternative Passwörter aus den angegebenen generieren, die auf numerischen Mustern basieren, um Ihre "minimalen" Änderungen zu erkennen.
Wenn Sie sich anmelden, überprüfen Sie das eingegebene Passwort bereits anhand eines Hashs. Es ist nicht erforderlich, das Passwort im Klartext zu speichern. Der gleiche Trick funktioniert beim Ändern eines Passworts. Überprüfen Sie einfach die eingegebenen und "minimalen Änderungen" generierten Passwörter anhand der historischen Hashes. Wenn das neue Passwort zufriedenstellend ist, verschieben Sie den aktuellen Passwort-Hash in den Verlaufssatz und ersetzen Sie ihn durch einen neuen Hash für das neue Passwort.
quelle
Wenn der Benutzer sein Kennwort ändert, muss er sein vorheriges Kennwort eingeben. Sie haben jetzt Zugriff auf zwei Klartextkennwörter, obwohl Sie keine Klartextkennwörter in Ihrer Datenbank speichern.
Führen Sie die gewünschten Überprüfungen für diese beiden Kennwörter durch. Dies hindert den Benutzer nicht daran, zwischen zwei Kennwörtern zu wechseln (mit einem Suffix - Sie können direkte Änderungen gemäß den Vorschlägen in anderen Antworten verhindern), verhindert jedoch die offensichtlicheren Fälle.
quelle
potatoSalad1
und sie auf das aktuelle Passwort aktualisieren möchtenpotatoSalad2
, sagen Sie, dass die Änderung zu gering ist, da Sie zu diesem Zeitpunkt beide Klartext-Passwörter haben. Aber weiter hinten haben Sie nur Hashes, und die Natur von Hashes ist, dass Sie nicht sagen können, ob zwei Hashes ähnlichen oder völlig unterschiedlichen Klartext als Eingabe hatten.Um die Antwort von @ martijnPieter zu ergänzen, kann die minimale Änderung implementiert werden, indem eine kurze Brute Force basierend auf den neuen und vorherigen Passwörtern durchgeführt wird (die Sie beide zur Verfügung haben).
Sie können beispielsweise alle Passwörter mit einem Hamming-Abstand von 1 oder 2 vom neuen Passwort durchlaufen und prüfen, ob sie mit einem alten Pass übereinstimmen
Sie sollten jedoch beachten, dass dies das Vertrauen der Benutzer in das Hashing von Kennwörtern verringern kann (Sie können im Wesentlichen ein vorheriges Kennwort zurückerhalten, um ein neues Kennwort abzulehnen).
quelle
Dies ist wirklich eher ein Nachtrag zu @ Brians kluger Antwort. Hats off auch an @Martijn Pieters für das Hinzufügen von Details darüber, wie man die alten Passwörter basierend auf dem aktuellen brutal erzwingt, und an @ratchet freak für "Hamming Distance". Ich lösche meine Antwort nicht, weil ich denke, dass sie einen interessanten Hintergrund für die Sicherung bietet.
Für die Speicherung von Kennwörtern nach dem neuesten Stand der Technik müssen mehrere Runden eines starken kryptografischen Einweg-Hashs (SHA-512 +) mit eindeutigem Salt (128-Bit +) für jeden Benutzer verwendet werden. Sie sollten jedoch nicht versucht sein, zusätzliche Informationen zu jedem Kennwort zu speichern. Je mehr Informationen Sie zu jedem Kennwort speichern, desto mehr gefährden Sie die Sicherheit Ihres Hashing-Algorithmus.
Beispiel
Überlegen Sie, wie einfach es wird, ein Kennwort zu erzwingen, wenn Sie Folgendes wissen:
Eine US-Tastatur hat 95 druckbare Zeichen. Wenn Sie also wissen, dass das Kennwort 7 Zeichen lang ist, erhalten Sie 95 ^ 7 = 69.833.729.610.000 = 7x10 ^ 13 Permutationen. Wenn es wirklich zufällig wäre, könnte es ein Jahr dauern, bis dies auf einem einzelnen 3 GHz-Prozessor geknackt ist. Aber:
Also (korrigiert dank @Hellion):
Das ist 50.000 Mal einfacher zu knacken! Das Speichern guter Informationen, um in diesem Fall ähnliche Passwörter zu vermeiden, hat Ihre Zeit für ein 7-stelliges Passwort von einem Jahr auf ein paar Stunden verkürzt. Das Entschlüsseln all Ihrer Passwörter mit einem leistungsstarken Multiprozessor-Desktop mit einer guten Grafikkarte und ein wenig Geduld ist jetzt sehr realisierbar. Ich hoffe, dieses einfache Beispiel zeigt, dass Ihr Hashing umso weniger sicher ist, je aussagekräftiger Sie ähnliche Passwörter vergleichen können.
Wichtigkeit von starkem Hashing
Datenbanken mit Passwörtern werden regelmäßig gestohlen, und es kommt jeden Monat zu gewaltigen Einbrüchen in die Nachrichten. Mist, erst letzten Monat hat der Staat SC alle Sozialversicherungsnummern verloren - hoppla! Wie viele dieser Verstöße sind noch vertuscht?
Schlussgedanke
Das Beängstigendste für mich ist, wenn Benutzer dasselbe oder ein ähnliches Passwort für mehrere Websites auswählen, damit der Angreifer auf alle zugreifen kann. Ich würde gerne eine bewährte Methode zur Verhinderung dieser Situation sehen, obwohl ich denke, dass das Verhindern der häufigsten falschen Kennwörter mehr hilft als zu verhindern, dass ein einzelner Benutzer sein falsches Kennwort auf derselben Site erneut verwendet. Das Beste, was ich vorschlagen kann, ist eine unternehmensweite Richtlinie für die Verwendung eines sicheren Passwort-Managers, der höchst zufällige Passwörter für jeden Ihrer Benutzer generiert und diese sicher speichert.
quelle
Zunächst können Sie die Hashes für die letzten "n" vorherigen Passwörter speichern, um zu überprüfen, ob deren neues Passwort ein vorheriges Passwort dupliziert. Sie haben auch den Klartext ihres aktuellen Passworts (weil sie sich angemeldet haben oder es Ihnen zur Authentifizierung ihrer Passwortänderungsanforderung zur Verfügung gestellt haben) und ihr neues Passwort, sodass Sie nach minimalen Änderungen zwischen diesen beiden Passwörtern suchen können.
Wenn es (für Sie) sehr wichtig ist, diese beiden Passwörter direkt mit "n" vorherigen Passwörtern zu vergleichen, müssen Sie diese Passwörter (verschlüsselt) speichern, um sie später abrufen zu können.
Obwohl dies als Sicherheitslücke angesehen werden könnte, könnten Verschlüsselungsmethoden implementiert werden, um eine ausreichende Sicherheit zu gewährleisten.
Jedes Mal, wenn das Kennwort geändert wird, können Sie die Verschlüsselung aller alten Kennwörter aufheben und alle Tests mit minimalen Änderungen durchführen.
Wenn jemand das Passwort dieser Person hatte und alle anderen erforderlichen Details kannte, konnte er diese Informationen für diese eine Person entschlüsseln. Wenn sie jedoch bereits das Passwort dieser Person haben, können sie sich bereits als diese Person anmelden und auf das Konto dieser Person zugreifen.
Außerdem müssen die alten Passwörter möglicherweise nicht im reinen Text gespeichert werden. Sie könnten verschleiert aufbewahrt werden. Oder als alphabetische Liste der Zeichen im Passwort gespeichert.
Ich sage nicht, dass dies im allgemeinen Fall eine empfohlene Vorgehensweise ist, aber vorausgesetzt, dass die von Ihnen beschriebene Aufgabe in Ihrem Fall erforderlich ist, ist dies eine Möglichkeit, dies mit einigen Sicherheitsmaßnahmen zu erreichen.
quelle