So implementieren Sie einen sicheren Kennwortverlauf

23

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?

Wizard79
quelle
2
Siehe auch: security.stackexchange.com/questions/4704/… (und BTW, diese Site ist möglicherweise ein besserer Ort für diese Frage). Was 'minimale Änderung' angeht, kann ich mir keine Alternative vorstellen, um alle Optionen zu generieren, die als 'minimale Änderung' (die abhängig von Ihrer Definition VIEL sein könnte!) Gelten und die Hashes zu vergleichen. Was ist die Definition von "minimale Veränderung"?
Kevin Vermeer
7
Das Speichern der letzten n Passwörter bedeutet nur, dass der Benutzer eine Sequenz wählt, die von 1 bis n + 1 reicht .
Joachim Sauer
11
Ich bin sehr skeptisch, dass eine solche Kennwortrichtlinie die Sicherheit verbessert. IMHO, es erhöht die Wahrscheinlichkeit, dass die Leute dazu greifen, ihr Passwort auf einem Notizzettel zu behalten. Kevins Link ist eine gute Diskussion. @ KevinVermeer - Sie können den Änderungsbetrag tatsächlich als Levenshtein-Abstand ( en.wikipedia.org/wiki/Levenshtein_distance ) messen , der auch als "Abstand bearbeiten" bezeichnet wird.
Nathan Long
5
Wenn Ihre Sicherheit so streng ist, können Sie genauso gut ein zufälliges Kennwort für den Benutzer generieren, ihn zwingen, es zu verwenden, und es in regelmäßigen Abständen ändern. Auf diese Weise haben Sie die vollständige Kontrolle über ihr Passwort.
Reactgular
2
@ Nathan: Das Speichern von Passwörtern auf einem Notizzettel ist tatsächlich sicher. Es ist nicht möglich, das Kennwort anzugreifen, es sei denn, Sie haben physischen Zugriff auf die Notiz, wodurch etwa 99% der Bedrohungen beseitigt werden. Bewahren Sie diese Notiz in einer Brieftasche oder einem Portemonnaie auf, und Sie müssen die Person im Grunde genommen überfallen, um sie zu erhalten. Dies bedeutet, dass eine Sicherheitsverletzung erkannt und gemildert werden kann.
Mattnz

Antworten:

22

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.

Martijn Pieters
quelle
Wenn der Benutzer also Password6 eingibt, sollte ich den numerischen Teil erkennen und zum Beispiel Password4 , Password5 , Password7 und so weiter versuchen . Ist das korrekt?
Wizard79
4
@Lorenzo: Richtig. Das Generieren von Alternativen kann so komplex sein, wie Sie es möchten. Stellen Sie jedoch sicher, dass Sie den richtigen Kompromiss zwischen Komplexität und Risiko finden.
Martijn Pieters
Ich bin mir nicht sicher, ob es ein guter Vorschlag für die Benutzer ist, die Zahl am Ende zu erhöhen - das ist nur ein bisschen vorhersehbar. Und dies wird exponentiell mehr, wenn Sie den Benutzern dies anweisen.
Wyatt Barnett
2
@WyattBarnett: Niemand fordert die Benutzer dazu auf. Es geht darum , Benutzer zu erkennen , die dies tun, und zu verhindern, dass das inkrementierte Kennwort verwendet wird.
Martijn Pieters
Ah, hier wurde etwas völlig falsch verstanden. Es tut uns leid.
Wyatt Barnett
28

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.

Brian
quelle
Nun, dies ist sicherlich eine clevere Lösung, wenn Sie nicht mit n vorherigen Passwörtern testen müssen , aber der Vorschlag, die Alternativen rechtzeitig zu generieren, ist besser. Noch besser ist es, Alternativen für beide Passwörter zu generieren!
Wizard79
2
@Lorenzo: Die Idee ist, dass Sie einen direkten Test gegen die n vorherigen Passwörter und einen stärkeren Test gegen das letzte Passwort durchführen. Es ist ein Kompromiss.
Brian
Ja. Wenn ihr aktuelles Passwort lautet potatoSalad1und sie auf das aktuelle Passwort aktualisieren möchten potatoSalad2, 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.
Nathan Long
7

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).

Ratschenfreak
quelle
Es gibt jedoch viele Sequenzen mit größeren Hamming-Entfernungen, z. B. Februar 2012 -> März 2012 oder Fr-09-28-12 -> Di-11-27-12 (Daten), Password_Alpha -> Password_Beta, Pass_1111 -> Pass_2222, Pass_qwer, Pass_tyui, Pass, _op [] oder Eleven -> Twelve (alternative Zählsysteme) oder FrankSmith -> FredJones -> FriarTuck oder Zorn -> animal -> apple (Namen in einem Firmenverzeichnis oder Wörter in einem Wörterbuch), die ein Angreifer mit dem Vorherige Passwörter konnten leicht erraten, aber Ihr Algorithmus würde es sehr schwer haben zu generieren.
Kevin Vermeer
@ KevinVermeer dann Konto für die in Ihnen Variation Generator, und akzeptieren, dass Sie nie alles bekommen
Ratschenfreak
+1 zur Verringerung des Vertrauens. Wenn ich etwas sehe, das mir sagt, dass mein Passwort zu sehr mit dem vor drei Monaten verwendeten Passwort übereinstimmt, frage ich mich sofort, ob sie es reversibel speichern ... oder ob sie einen großartigen Programmierer haben. Skepsis gewinnt normalerweise.
Tim Post
5

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:

  • Es ist 7 Zeichen lang
  • Die Zeichen 3 bis 5 sind in Großbuchstaben geschrieben (4 ist in Kleinbuchstaben).
  • 1 und 7 sind Zahlen
  • 6 ist ein Symbol

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:

  • Es gibt nur 26 Groß- und 26 Kleinbuchstaben
  • Es gibt nur 10 Ziffern, die 100 Möglichkeiten für diese beiden Zahlen ergeben
  • Es gibt nur 32 Symbole

Also (korrigiert dank @Hellion):

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

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.

GlenPeterson
quelle
1
minor nit: Die Passwortmöglichkeiten sind immer noch multiplikativ, also (26 ^ 4) * 100 * 32 = 1.462.323.200. Wenn wir davon ausgehen, dass das Knacken von (95 ^ 7) Möglichkeiten ein Jahr dauert, dauert das Knacken dieser kleineren Anzahl von Möglichkeiten ungefähr 11 Minuten.
Hellion
@Hellion - Ups! Vielen Dank für den Hinweis. Ich habe es korrigiert.
GlenPeterson
1

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.

  1. Speichern Sie jedes Passwort (verschlüsselt) für die letzten "n" Passwörter.
  2. Speichern Sie das Datum und die Uhrzeit der Erstellung des letzten Kennworts.
  3. Speichern Sie den Hash des neuesten Passworts.
  4. Verschlüsseln Sie alle Kennwörter mit dem Hash (Salted) des aktuellen Kennworts und dem Zeitstempel für die Kennworterstellung sowie möglicherweise einer Kontonummer oder E-Mail-Adresse.
  5. Entschlüsseln und verschlüsseln Sie alle Kennwörter jedes Mal neu, wenn ein neues Kennwort erstellt wird.

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.

Kevin Fegan
quelle
Diese Antwort macht einige schreckliche Vorschläge in Bezug auf die Sicherheit. Wir sollten nicht in der Lage sein, die Passwörter einfach zu entschlüsseln oder "auf verschleierte Weise" zu speichern, anstatt sie stark zu verschlüsseln.
user45623