it-swarm.com.de

Ist das zufällige Generieren von Passwörtern aus einer Reihe von Wörterbuchwörtern kryptografisch sicher?

Wir sollten alle das XKCD-Comic zur Passwortstärke kennen, was (angemessen) darauf hindeutet, dass ein Passwort, das auf mehreren gebräuchlichen Wörtern basiert, sicherer und einprägsamer ist als ein Passwort wie Aw3s0m3s4u(3 Oder so.

Ich habe eine Anwendung (plattformübergreifend), für die ich etwas sichere Passwörter generieren möchte, und meine Passwortanforderungen sind viel weniger anspruchsvoll: Wenn das Passwort keine Leerzeichen enthält, erwarte ich die 'Mehrfachsymbole, Zahlen, gemischtes Alpha und mehr als 6 Zeichen'. , aber wenn das Passwort mehr als ein nicht aufeinanderfolgendes Leerzeichen hat, entspanne ich die Einschränkung für Symbol/Zahl/gemischte Groß- und Kleinschreibung und benötige stattdessen mindestens zwei Wörter, die nicht weniger als 4 Zeichen enthalten, mit einer Mindestkennwortlänge von 15 Zeichen.

Die Frage betrifft nicht diesen Aspekt, sondern das Generieren: Unter der Annahme, dass ich ein leicht zu merkendes und schwer zu erratendes Passwort für den Benutzer generieren möchte, ist es kryptografisch sicher ein Passwort basierend auf 5 oder so Wörterbuchwörtern aus einer 10k-Wortliste generieren? (Im wahrsten Sinne des Wortes befinden sich 10.000 Wörter in meiner Datenbank, die aus verschiedenen Quellen, E-Mails usw. stammen.) Das sind alles ziemlich gebräuchliche Wörter mit einer Länge von mindestens 3 Zeichen.

Jetzt möchte ich nicht, dass diese Einmalkennwörter erstellt, aber ich vermute, ich sollte mindestens vom Benutzer verlangen, dass er sie ändert etwas anderes beim Anmelden nach Verwendung dieses generierten Passworts, was in Ordnung ist und ich kann , aber ich möchte auch, dass Benutzer die Möglichkeit haben (beim Ändern eines Passworts), ein "sicheres" Passwort zu generieren das passt zu meinen anforderungen.

Wie einfach/schwierig wäre es, ein mit diesem Schema generiertes Passwort anzugreifen? Es gibt keine feste Länge. Wörter in dieser Datenbanktabelle haben eine Länge von 3 bis 11 Zeichen (environment ist beispielsweise ein Wort in der Datenbank). Das Programm, das die Passwörter generiert, wählt nicht zwei Wörter mit 4 oder weniger Zeichen aus (das kürzeste Passwort kann also ein dreistelliges Wort, 4 fünf Zeichen sein Wörter und 4 Leerzeichen (insgesamt 27 Zeichen), und es wird nicht denselben Begriff zweimal in einem Passwort verwenden.

Basierend auf Beispielen, die ich dagegen ausgeführt habe, beträgt die vom Programm generierte durchschnittliche Kennwortlänge ~ 34 Zeichen, was mir akzeptabel erscheint. Selbst wenn wir annehmen, dass jedes der 27 minimalen Nicht-Leerzeichen (also 23 Zeichen am Ende) 26 mögliche Zustände sein kann (a-z), Ist das 23^26 Oder 2.54e+35 Möglichkeiten.

Die Datenbank enthält 994 Wörter mit einer Länge von 3 bis 4 Zeichen.

Wir können auch annehmen, dass der Angreifer das Wörterbuch und die Generierungsparameter/-algorithmen hat. Ist dies immer noch sicher, kann ich es schaffen, ein Wort von dem generierten Passwort zu entfernen (das sind immer noch 21 Zeichen für 18^26 Möglichkeiten (4.33e+32), Die allein auf Entropie basieren), das einzige Problem, das ich habe siehe ist, dass dies nicht auf Zeichen Entropie basiert, sondern auf Word-Entropie, was bedeuten würde, dass das 5-Wort-Passwort 10000*9006*9005*9004*9003 Möglichkeiten oder 6.5e+19 Möglichkeiten, und das 4-Wort-Passwort ist 10000*9006*9005*9004 Möglichkeiten oder 7.30e+15. Im Vergleich zu einem normalen 6-stelligen Passwort ((26+26+10+33)^6 Oder 7.35e+11 Möglichkeiten: 26 Unteres Alpha, 26 Oberes Alpha, 10 Zahlen, 33 Symbole) ist deutlich stärker.

Eine andere Annahme, die ich gemacht habe: Benutzer werden dies aufschreiben, das tun sie immer. Ich vermute , dass fünf zufällige Wörter auf einem Blatt Papier (hoffentlich nicht in direkter Sicht, aber leider das wahrscheinlichste Szenario) weniger wahrscheinlich sind als potenzielles Passwort aufgegriffen zu werden als ein komplexer Begriff, der wie ein traditionelles Passwort aussieht .

Bevor ich zu meinen eigentlichen Fragen komme, werden die Passwörter alle gesalzen, bevor sie in der Datenbank gespeichert werden, und dann 100 Mal mit dem SHA-512 - Algorithmus gehasht, wobei das Salt angehängt wird zwischen jedem Hash. Wenn sich der Benutzer erfolgreich anmeldet, wird das Salt geändert und ein neuer Kennwort-Hash erstellt. (Ich gehe davon aus, dass dies bei einem Brute-Force-Offline-Angriff nicht viel hilft, aber es sollte meiner Meinung nach gegen aktive Online-Angriffe helfen.)

DatabasePassword = SHA512(...SHA512(SHA512(SHA512(password + salt) + salt) + salt) + salt)...)

Also endlich meine aktuellen Fragen:

  1. Ist meine Mathematik korrekt? (Sie müssen dies nicht unbedingt beantworten, ich bin sicher, dass es im Prinzip nah genug ist, um meine Bedenken zu demonstrieren.)
  2. Ist diese Generation sicher oder sollte ich mich an die 'traditionelle' Passwortgenerierung halten? Beachten Sie, dass ein Angreifer keine Vorstellung davon hat, ob das Kennwort des Benutzers mit diesem Algorithmus generiert oder vom Benutzer ausgewählt wurde. Der Angreifer kann eine Annahme treffen wenn sie die Länge kennen, aber das kann sicher sein oder auch nicht.
  3. Zuletzt habe ich irgendwelche Annahmen getroffen, die die Sicherheit dieser 'Idee' erheblich verändern (erhöhen oder verringern) würden? (Unter der Annahme, dass die Entropie pro Zeichen eines 6-Zeichen-Passworts beispielsweise 95 beträgt.)

Entschuldigung für die Länge, ich bin es gewohnt, mich zu sehr zu erklären, um hoffentlich Verwirrung zu lindern.


Es wurde darauf hingewiesen, dass meine Frage extrem ähnlich ist wie diese , ich möchte auf die Unterschiede in meiner Generierungsmethode hinweisen (obwohl sie ehrlich gesagt immer noch ähnlich ist genug, dass es als Duplikat betrachtet werden kann, überlasse ich es der Community zu entscheiden):

  1. Jedes Wort ist durch ein Leerzeichen getrennt. Dies bedeutet, dass alle außer den ersten und letzten drei Zeichen einen zusätzlichen potenziellen Status haben.
  2. Das Passwort wird nicht von einem Menschen ausgewählt, sondern (meistens) einheitlich zufällig generiert. Es werden keine Wörter anderen vorgezogen, außer dass nur ein ultrakurzes Wort (3 oder 4 Zeichen) zulässt. Sobald der Zufallsgenerator ein Wort dieser Länge auswählt, dürfen keine weiteren Wörter ausgewählt werden. (Obwohl die Position, an der Word in der Liste der Wörter steht, immer noch zufällig ist und möglicherweise kein ultrakurzes Wort ausgewählt ist.)
  3. Dies wird mit einer separaten Passwortbeschränkung gemischt, was bedeutet, dass der Angreifer zwei Vektoren hat, die er zu knacken versucht. Der Benutzer könnte ein Passwort ausgewählt haben, das den "traditionellen" Anforderungen entspricht, oder ein Passwort, das den "XKCD" -Anforderungen entspricht.
29
Der Kommissar

Erstens gibt es kein Konzept wie ein kryptografisch sicheres Passwort. Das Ziel eines Passworts ist es, für einen Angreifer schwer zu erraten, und wie schwer es zu erraten sein sollte, hängt davon ab, wie das Passwort verwendet wird: Wenn das Konto nach drei fehlgeschlagenen Versuchen gesperrt wird, kann das Passwort schwächer sein als bei einem Angreifer kann eine unbegrenzte Anzahl von Passwörtern versuchen oder wenn der Angreifer Zugriff auf die gehashten Passwörter hat.

In Ihrem Fall erstellen Sie ein Passwort, indem Sie zufällig 5 Wörter aus einem Satz von 10.000 Wörtern auswählen. Angenommen, der Angreifer kennt Ihr Wörterbuch (nicht unwahrscheinlich, da Ihre Anforderung leicht zu merkende Wörter ist) und die Art und Weise, wie das Kennwort aus dem Wörterbuch erstellt wird, bedeutet dies, dass es (10 ^ 4) ^ 5 = 10 ^ 20 Varianten gibt. Dies ähnelt dem Erraten von 20 Ziffern oder eines Passworts mit 12..13 zufälligen alphanumerischen Groß- und Kleinschreibung. Solche Passwörter werden für die meisten Zwecke normalerweise als sicher genug angesehen.

Was die Speicherung des Passworts betrifft: Erfinden Sie keine eigene Methode, sondern verwenden Sie Methoden, die sich als gut erwiesen haben. Für Details siehe Wie man Hash-Passwörter sicher hasht? In der aktuellen Form würde ich die gewählte Methode als schwach betrachten, da Sie nur 100 Iterationen mit einer Hash-Funktion verwenden, die schnell ausgelegt ist. Nur zum Vergleich: PBKDF2 hat bereits im Jahr 2000 mindestens 1000 Iterationen empfohlen, und LastPass hat 2011 100.000 Iterationen für serverseitiges Hashing verwendet. Glücklicherweise können Sie den schwächeren Kennwortspeicher durch komplexere Kennwörter ausgleichen.

35
Steffen Ullrich

Es scheint mir, dass Ihre Berechnungen korrekt sind. Beachten Sie jedoch die folgenden Schwächen:

  1. Ein Angreifer kann und wird sich mit mehreren ( [~ # ~] vielen [~ # ~] ) Konten für Ihren Dienst anmelden. Von dort aus ist es trivial, eine nahezu originale Word-Liste zu erstellen. Angenommen, der Angreifer kennt die Word-Liste.
  2. Der Angreifer testet auch die Einschränkungen Ihrer Kennwortlänge. Wie beschrieben hier , ist eine Mindestkennwortlänge von 12 Zeichen ein guter Hinweis für einen Angreifer, dass aufeinanderfolgende Wörterbuchwörter verwendet werden, wodurch der Suchraum verringert wird.
  3. Die eigentliche Word-Liste macht auch einen Unterschied. Stellen Sie sich ein Szenario vor, in dem Ihre Word-Liste aus mehr als 8 Zeichen langen Wörtern besteht und Ihre maximale Kennwortlänge beispielsweise 30 beträgt. Dies bedeutet, dass der Angreifer sicher davon ausgehen kann, dass kein Kennwort mit 4 aufeinanderfolgenden 8-Zeichen-Wörtern erstellt wird. Ähnlich können je nach Auswahl der Wortliste viele Annahmen existieren. Eine weitere Überlegung, die Sie meiner Meinung nach verpasst haben, ist die Wortlängenentropie.
  4. Schließlich bedeutet die Tatsache, dass Sie Ihren Kunden einen sicheren und leicht zu merkenden Passwortgenerator zur Verfügung stellen, dass sie diesen verwenden . Der Angreifer kann also auch davon ausgehen, dass alle außer den sicherheitsbewusstesten Ihre Word-Liste und Ihren Kennwortgenerator verwenden.

Trotz alledem denke ich, dass das, was Sie vorschlagen, sicher ist. Selbst wenn man all das berücksichtigt, ist der resultierende Suchraum immer noch riesig.

Dies sind alle Probleme/Annahmen, die ich in Ihrer Beschreibung gefunden habe und die möglicherweise die Sicherheit Ihres Passwortgenerators verringern. Für Ihre Überlegung.

21
MiaoHatola

Aufbauend auf MiaoHatolas Antwort:

Nach dem ersten Punkt von MiaoHatola könnte Ihr Angreifer die Liste eingrenzen und beide Wörterbücher kennen (das eine mit kurzen Wörtern und das andere mit Wörtern aus 5 Buchstaben). Sie sagten, Ihre kurze Word-Liste habe 994 Einträge. Sie haben eine Chance von 1/994, beim ersten Versuch das kurze Wort zu bekommen. Angenommen, Sie verwenden eine Liste mit 10.000 gebräuchlichen Wörtern mit 5 Buchstaben. Diese Fraktionen gelten:

1/994 * 1/10000 * 1/9999 * 1/9998 * 1/9997

Dieses Problem zeigt die kombinierten Chancen, beim ersten Versuch alles zu erraten, vorausgesetzt, sie kennen Ihre Word-Listen.

Dies ist eine 1: 9.934.037.100.000.000.000 Chance, nur die Wörter zu erraten, nicht die Reihenfolge der Wörter. Faktor in der Reihenfolge, und Sie erhalten eine ziemlich hohe Zahl. Mein Rechner zählt nicht so hoch.

Diese Zahl enthält nicht die Möglichkeit dessen, was MiaoHatola in ihrem dritten Punkt erwähnt hat, weil Sie sagten, Sie hätten keine maximale Länge. Eine Sache noch:

Warum nicht auch diese Zahl zufällig auswählen, anstatt jedes Mal nur 5 Wörter zufällig auszuwählen? Wirf ab und zu ein zusätzliches Wort mit 7 Buchstaben ein. Fügen Sie am Ende möglicherweise eine zweistellige Zahl hinzu. Versuchen Sie, den Angreifer zu erraten. Das erhöht Ihre Sicherheit erheblich. An diesem Punkt könnten Sie die gehashten Passwörter unbewacht lassen, da die schiere Menge an Möglichkeiten überwältigend ist. Um Ihre Frage zu beantworten, ja. Dies erhöht die Sicherheit. Um viel.

4
user139260

Sie können die Eindeutigkeit nicht auf 27 Zeichen stützen, da die Zeichen nicht zufällig sind.

Wenn Sie 10K Wörter haben und 5 Wörter verwenden, dann 10 ^ 20 eindeutige Passwörter (oder Phrasen)
100.000.000.000.000.000.000

Ist das einzigartig genug, um einen Brute-Force-Angriff zu vereiteln?
Bei 100 pro Millisekunde sind das über 30.000 Jahre

Die Kosten sind jedoch, dass Benutzer 27 Zeichen eingeben. Ich möchte keine 27 Zeichen eingeben. Ich werde es wahrscheinlich die halbe Zeit falsch eingeben und muss wieder eintreten. 5 Wörter in zufälliger Reihenfolge sind nicht leicht zu merken.

Betrachten Sie 6 Zeichen von A-Z, a-z, 0-9 und _
Das ist 62.523.502.209 einzigartig
Als Benutzer würde ich lieber 6 zufällig auswendig lernen und eingeben

Ich denke nicht, dass 5 zufällige Wörter eine gute Möglichkeit wären, ein Passwort zu verschleiern. Vor allem, wenn die Leute wissen, dass Ihre Anwendung dies tut.

1
paparazzo