it-swarm.com.de

Wie ist Hashing sicher, wenn eine bestimmte Zeichenfolge immer denselben Hash generiert?

Ich bin ein Neuling im Hashing und ich verstehe, dass MD5 (ich weiß, dass es kaputt ist) und SHA-1 alle feste Hashing-Algorithmen sind. Angesichts der Tatsache, dass die meisten Passwörter Wörter aus Wörterbüchern oder ähnliche Passwörter sind, ist es sinnvoll, sie in einem Hash zu speichern Kann ein Angreifer Google verwenden, um das ursprüngliche Passwort zurückzuverfolgen?

Ich meine, ist SHA-1 oder SHA-2 oder einer dieser Algorithmen nicht nutzlos?

11
msamogh

Deshalb Sie müssen ein Salz verwenden .

Durch Hinzufügen eines global eindeutigen Salt zu jedem Kennwort wird sichergestellt, dass selbst wenn jedes Kennwort gleich ist, immer noch eindeutige Hashwerte generiert werden.

Trotzdem ist eine einzelne Iteration von SHA-1 oder SHA-2 immer noch kein guter Weg, um Passwörter zu hashen, da sie zu schnell sind. Selbst mit einem einzigartigen Salz kann moderne Hardware Milliarden von Kandidatenkennwörtern pro Sekunde durchsuchen, um die Eingaben zu finden. Ein guter langsamer Algorithmus wie bcrypt mit einem geeigneten Arbeitsfaktor sollte stattdessen verwendet werden .

33
Xander

Passwort-Hashing ist nur eine sehr kleine Verwendung für einen Hash. Hashes können für andere Zwecke sehr wertvoll sein, in Konstrukten, die Hashes mit Schlüsseln kombinieren, und in anderen Konstrukten.

Für das Passwort-Hashing sollten Sie wie immer Thomas Pornins kanonische Antwort auf Wie man Passwörter sicher hasht lesen.

Für diese Antwort lautet die Zusammenfassung: Im Falle eines Kennwortdatenbanklecks macht eine ausreichend fehlerhafte Kennwortspeicherung (Klartext und/oder reversible Verschlüsselung, bei der der Schlüssel dem Angreifer bekannt ist) das beste Kennwort wertlos. Ausreichend schlechte Passwörter machen den besten Passwortspeicher wertlos. Auf dieser Ebene ist nichts sicher, da eine oder beide Parteien die für jede Art von Sicherheit erforderliche Mindestgrenze nicht erreicht haben.

Dann kommen wir zu "wirklich schrecklich schrecklichem Passwortspeicher" wie ungesalzene einzelne Iterationen von Hashes. Dies ist genau wie unten, aber jeder Versuch gilt für jedes einzelne Passwort gleichzeitig. Auf dieser Ebene sind nur eindeutige, verrückte Passwörter sicher, da zwei Benutzer mit demselben Passwort offensichtlich sind - sie haben denselben Hash.

Dann kommen wir zu "wirklich schrecklichem Passwortspeicher" wie einzigartigen gesalzenen einzelnen Iterationen von Hashes pro Zeile. Von allen Hashes haben offensichtlich langsamere (für den Angreifer) Hashes einen kleineren Bereich von Passwörtern, die nach einer bestimmten Zeit, die für das Ausprobieren von Vermutungen aufgewendet wurde, wertlos sind.

  • Das eindeutige Salz pro Zeile erzwingt lediglich, dass jedes Kandidatenkennwort für jeden Kennwort-Hash erneut gehasht wird
    • Und verhindern Sie, dass vorberechnete Hashes viel wert sind.
  • Angenommen, Januar 2015 oclHashcat Geschwindigkeiten für eine einzelne Maschine mit 8 R9 290X
    • 2.4E17 oder ungefähr 2 ^ 57.7 einzelne MD5-Versuche pro 30 Tage
      • Mehr oder weniger 4 Wörter, die kryptografisch zufällig aus allen Wörtern der Länge 7 oder weniger in Ubuntus American English Small Dictionary ausgewählt wurden, d. H. Ungefähr 21000 ^ 4 oder 1.9E17 oder 2 ^ 57.4, ist dieser Schlüsselraum.
      • Ja, "korrektes Pferdebatterystapel" ist in diesem Set enthalten. Siehe meine Antwort auf Sollte ich offensichtlich schlechte Passwörter ablehnen für weitere Berechnungen.
    • 1.2E16 oder ungefähr 2 ^ 53.4 einzelne SHA-512-Versuche pro 30 Tage
      • Bei kryptografisch zufälligen Passwörtern mit neun Zeichen mit oberen, unteren und Zahlenzeichen handelt es sich um diesen Schlüsselbereich (62 ^ 9 oder 1.35E16 oder 2 ^ 53.6).
  • Wahnsinnig starke Passwörter sind hier sicher.
    • Kryptografisch zufällige Passwörter mit 35 Zeichen für obere, untere und Zahlen sind ungefähr so ​​sicher wie 192-Bit-Verschlüsselung mit 62 ^ 35- oder 5.4E62- oder 2 ^ 208.4-Möglichkeiten.
  • Starke Passwörter sind wahrscheinlich in Ordnung
    • Kryptografisch zufällige Passwörter mit 20 Zeichen für obere, untere, Zahlen- und US-Tastatursymbole sind ungefähr so ​​sicher wie 128-Bit-Verschlüsselung mit 94 ^ 20- oder 2.9E39- oder 2 ^ 131.1-Möglichkeiten.
    • Kryptografisch zufällige Passwörter mit 14 Zeichen für Ober-, Unter- und Zahl sind ungefähr das Minimum, das ich auf dieser Ebene mit 62 ^ 14 oder 1.2E25 oder 2 ^ 83.4 als "vielleicht sicher für ein paar Jahre, aber nicht für Jahrzehnte" bezeichnen würde Möglichkeiten.

Danach werden gute, solide Algorithmen verwendet, d. H. PBKDF2, BCrypt oder SCrypt mit niedrigen Iterationszahlen. Hier ist Hashing für einigermaßen komplexe Passwörter sicher!

  • Denken Sie daran, PBKDF2/RFC2898 ist lediglich ein Konstrukt zum mehrmaligen Iterieren eines HMAC.
  • Denken Sie daran, HMAC/RFC2104 ist lediglich ein Konstrukt zur Verwendung eines Hashs (wie SHA-1 oder MD5 oder SHA-512 oder Whirlpool oder ...) mit einem Schlüssel und einigen Daten
  • Angenommen, Januar 2015 oclHashcat Geschwindigkeiten für eine einzelne Maschine mit 8 R9 290X
    • 2.9E12 oder ungefähr 2 ^ 41 WPA/WPA2-Versuche pro 30 Tage
      • 8 kryptografisch zufällige Passwörter mit nur einem Buchstaben und einer Zahl (36 ^ 8 oder 2.8E12) liegen nahe daran.
      • 3 kryptografisch zufällig ausgewählte Wörter mit einer Länge von 7 oder weniger in Ubuntus American English Small überschreiten diese Werte, 21000 ^ 3 oder 9.2E12
      • Kryptografisch zufällige Muster aus einem Großbuchstaben, 7 Kleinbuchstaben und einer Zahl befinden sich in diesem Schlüsselbereich, 26 * 26 ^ 7 * 10 oder 2E12

Danach wird PBKDF2, BCrypt oder SCrypt mit einer ausreichend hohen Anzahl von Iterationen/Arbeitsfaktor verwendet. Auf dieser Ebene ist Hashing für etwas weniger komplexe Passwörter und/oder für eine etwas längere Zeit sicher.

Beachten Sie, dass PBKDF2-HMAC-MD5 mit einer ausreichend hohen Iterationszahl amüsanterweise nicht kaputt ist, obwohl Sie entweder ein Idiot sein müssten, um es zu verwenden, oder mit so etwas wie einem FPGA arbeiten müssten mit genügend Toren für MD5, aber nicht für SHA-1 oder SHA-2.

Beachten Sie, dass Angreifer immer mehr Macht gewinnen ... und dass Passwortlecks für immer in der Wildnis bleiben. Alle Passwörter, die gefunden werden, sollten nie wieder als sicher angesehen werden - die größte Wortliste, die ich gesehen habe, enthält Gigabyte zuvor geknackter oder in Klartext-Passwörtern gefundener, und einige sind schrecklich komplex ... aber sie wurden schlecht gespeichert und befinden sich jetzt in Wortlisten.

Regelbasiert Angriffe mit Wörterbüchern sind ein Thema für eine andere Frage :).

11

SHA-1 usw. sind nicht für Passwörter ausgelegt.

Sie dienen zum Signieren von Dokumenten (mit bekanntem Text) gegen Änderungen wie das Hinzufügen einer zusätzlichen 000 zu Ihrem Gehaltsscheck. Wenn es schwierig ist, ein zufälliges Dokument mit demselben Hash zu finden, ist es viel schwieriger, ein Dokument zu finden, das Sinn macht und den gewünschten Effekt erzielt!

Eine der wichtigen Eigenschaften von kryptografischen Hashes (im Gegensatz zu Hashes, die z. B. für Datenstrukturen verwendet werden) ist, dass ein einzelnes Bit, das in der Eingabe geändert wurde, einen völlig anderen Hash erzeugen sollte, auf eine Weise, die Sie nicht können sagen Sie voraus, wie dies rückgängig gemacht werden soll.

Zum Verschlüsseln von Passwörtern wäre dies nicht erforderlich (Sie könnten sehr lange Salze verwenden, um zu ähnliche Passwörter in den Digests zu verbergen; aber es ist natürlich schön, diese Eigenschaft zu haben, so dass passw0rd und Passwort völlig unterschiedliche Ergebnisse generieren )

Denken Sie außerhalb des Passwortfeldes.

Diese Hashes können für Passwörter verwendet werden, wenn Sie ein Salz hinzufügen (immer Salze verwenden) und genügend Iterationen durchführen, um Brute Force kostspielig zu machen. Aber das ist nicht ihr Designziel. Das Entwurfsziel ist eine unvorhersehbare Mischung der Bits, so dass jedes Bit etwa 50% der Ausgabe ändert.

Es ist NICHT die Schuld des Hashings, sondern die der Benutzer

die meisten Passwörter sind Wörterbuchwörter oder ähnliche Passwörter

Mein Passwort ist

iL0v3$t4ckExch4n9everymuch<3 xoxoxox

Verwenden Sie jetzt Google, um den Hash für mein Passwort unter MD5 oder SHA-1 zu finden. Ich bezweifle sehr, dass er in einer Rainbow-Tabelle vorberechnet ist. Tatsächlich war ich Mitglied einer Website, die gehackt wurde, und der Hacker hat den ungesalzenen MD5-Hash meines Passworts online gestellt. Bis heute ist es verfügbar und ich habe absichtlich dasselbe Passwort und dieselbe E-Mail-Adresse auf einer anderen Website verwendet, um zu prüfen, ob sich jemals jemand die Mühe machen wird, eine Rainbow-Tabelle zu erstellen, in der mein 26-Buchstaben-Passwort angezeigt wird.

2
Ulkoma

Sie müssen zwei Dinge unterscheiden:

A) Die Hash-Funktion als Funktion zum Transformieren eines bestimmten Satzes von Informationseingaben in einen genau definierten Satz von Ausgaben. Wenn Sie sich diesen Aspekt einer Hashing-Funktion ansehen, müssen zwei Probleme gelöst werden:

1) Es sollte so konzipiert sein, dass Kollisionen vermieden werden - es wäre ein Chaos, wenn Sie eine hohe Kollisionsrate haben, da es einfacher wäre, das Passwort zu "erraten". Stellen Sie sich eine Funktion vor, die jede ASCII-Position jeder Zeicheneingabe zusammenfasst: Das Ergebnis für "ab" ist dasselbe wie für "ba". Das wäre also wirklich eine sehr schlechte Wahl.

2) Es sollte deterministisch sein, damit Sie das Ergebnis reproduzieren können. Hashes werden zum Vergleich verwendet. Es sollte also klar sein, dass eine Funktion, die keine deterministische Ausgabe hat, nutzlos ist.

B) Die Verwendung eines Hashing-Algorithmus im Zusammenhang mit dem Speichern von Passwörtern in einer Datenbank.

Wie ist Hashing sicher, wenn eine bestimmte Zeichenfolge immer denselben Hash generiert?

Aus (A) ist klar, dass ein möglicher Angriffsvektor, da die Ausgabe deterministisch ist, darin bestehen würde, vorgefertigte/berechnete Hashes alias Rainbow-Tables zu verwenden.

einfaches Beispiel :

Angenommen, Ihr Passwort lautet "Hallo Welt". Die Summe MD5 - lautet: 6f5902ac237024bdd0c176cb93063dc4. Das Googeln (unsere " Regenbogentabelle" für das Beispiel) für diese Prüfsumme führt Sie zu this Speicherort, wo Sie eine Datei finden, deren Inhalt "Hallo" ist Welt". Einfach Hashing ist also nicht genug. Eine Möglichkeit zur Verbesserung der Sicherheit besteht darin, ein Salz zu verwenden (das neben dem Hash gespeichert werden kann). In unserem Fall fügen wir 6f5902ac237024bdd0c176cb93063dc4 (die MD5 - Summe des vorherigen Beispiels zur Passphrase hinzu => " hallo world6f5902ac237024bdd0c176cb93063dc4 ". Das neue MD5 ist f59c64e092edb4fbc2904a3b28ce88c5. Wenn Sie das googeln, haben Sie keine Ergebnisse.

Achtung: Ich schlage nicht (!) Vor, MD5 auf diese Weise zu verwenden, ist in irgendeiner Weise " sicher" - aber ich habe es verwendet, um zu veranschaulichen, wie ein Salz beeinflusst das Ergebnis einer Hashing-Funktion. Obwohl der Hash deterministisch berechnet wird, ist die Ausgabe für ein Passwort und zwei verschiedene Salze unterschiedlich genug, um den Teil " Raten" etwas schwieriger zu machen.

0
Thomas Junk