it-swarm.com.de

Ist SHA-1 für die Speicherung von Passwörtern sicher?

Fazit: SHA-1 ist so sicher wie alles andere gegen Preimage-Angriffe, jedoch ist es einfach zu berechnen, was bedeutet, dass es einfacher ist, eine Bruteforce oder ein Wörterbuch bereitzustellen Attacke. (Gleiches gilt für Nachfolger wie SHA-256.) Je nach den Umständen ist eine Hash-Funktion, die als rechenintensiv konzipiert wurde (z. B. bcrypt), möglicherweise die bessere Wahl.


Einige Leute werfen Bemerkungen wie "SHA-1 ist kaputt" oft vor, also versuche ich zu verstehen, was das genau bedeutet. Nehmen wir an, ich besitze eine Datenbank mit SHA-1-Passwort-Hashes und ein Angreifer mit einem hochmodernen SHA-1-Brechalgorithmus und einem Botnetz mit 100.000 Computern kann darauf zugreifen. (Die Kontrolle über 100.000 Heimcomputer würde bedeuten, dass sie ungefähr 10 bis 15 Vorgänge pro Sekunde ausführen können.) Wie viel Zeit würden sie benötigen

  1. das Passwort eines Benutzers herausfinden?
  2. das Passwort eines Benutzers herausfinden?
  3. das Passwort aller Benutzer herausfinden?
  4. einen Weg finden, sich als einer der Benutzer anzumelden?
  5. einen Weg finden, sich als bestimmter Benutzer anzumelden?

Wie ändert sich das, wenn die Passwörter gesalzen werden? Ist es wichtig, wie gesalzen wird (Präfix, Postfix, beides oder etwas Komplizierteres wie xor-ing)?

Hier ist mein aktuelles Verständnis nach einigem googeln. Bitte korrigieren Sie in den Antworten, wenn ich etwas falsch verstanden habe.

  • Wenn es kein Salz gibt, findet ein Regenbogenangriff sofort alle Passwörter (außer extrem langen).
  • Wenn es ein ausreichend langes zufälliges Salt gibt, ist der effektivste Weg, die Passwörter herauszufinden, ein Brute-Force- oder Wörterbuchangriff. Weder Kollisions- noch Präimage-Angriffe helfen dabei, das tatsächliche Passwort herauszufinden. Kryptografische Angriffe auf SHA-1 sind hier keine Hilfe. Es ist nicht einmal wichtig, welcher Algorithmus verwendet wird - man könnte sogar MD5 oder MD4 verwenden und die Passwörter wären genauso sicher (es gibt einen kleinen Unterschied, da die Berechnung eines SHA-1-Hash langsamer ist).
  • Um zu beurteilen, wie sicher "genauso sicher" ist, nehmen wir an, dass ein einzelner sha1-Lauf 1000 Vorgänge erfordert und Kennwörter Groß-, Klein- und Ziffern enthalten (dh 60 Zeichen). Das heißt, der Angreifer kann 10 testen15* 60 * 60 * 24/1000 ~ = 1017 potenzielles Passwort pro Tag. Für einen Brute-Force-Angriff bedeutet dies, dass alle Kennwörter in 3 Stunden auf 9 Zeichen, in einer Woche auf 10 Zeichen und in einem Jahr auf 11 Zeichen überprüft werden. (Für jedes zusätzliche Zeichen wird das 60-fache benötigt.) Ein Wörterbuchangriff ist viel, viel schneller (selbst ein Angreifer mit einem einzelnen Computer kann ihn in Stunden ausführen), findet jedoch nur schwache Kennwörter.
  • Um sich als Benutzer anzumelden, muss der Angreifer nicht das genaue Kennwort herausfinden. Es reicht aus, eine Zeichenfolge zu finden, die zum selben Hash führt. Dies wird als erster Preimage-Angriff bezeichnet. Soweit ich feststellen konnte, gibt es keine Preimage-Attacken gegen SHA-1. (Ein Bruteforce-Angriff würde 2 dauern160 Operationen, was bedeutet, dass unser theoretischer Angreifer 10 benötigen würde30 Jahre, um es durchzuziehen. Grenzen der theoretischen Möglichkeit liegen bei 260 Operationen, bei denen der Angriff einige Jahre dauern würde.) Es gibt Preimage-Angriffe gegen reduzierte Versionen von SHA-1 mit vernachlässigbarer Auswirkung (für den reduzierten SHA-1, der 44 statt 80 Schritte verwendet, Angriff Die Zeit ist um 2 gesunken160 Operationen zu 2157). Es gibt Kollisionsangriffe gegen SHA-1, die innerhalb der theoretischen Möglichkeiten liegen ( das Beste, das ich gefunden habe verkürzt die Zeit von 280 zu 252), aber diese sind gegen Passwort-Hashes nutzlos, auch ohne zu salzen.

Kurz gesagt, das Speichern von Passwörtern mit SHA-1 scheint absolut sicher zu sein. Habe ich etwas verpasst?

Update: Marcelo wies auf einen Artikel hin, in dem ein zweiter Preimage-Angriff in 2) erwähnt wird106 Operationen . ( Edit: Wie Thomas erklärt , ist dieser Angriff ein hypothetisches Konstrukt, das nicht für reale Szenarien gilt.) Ich verstehe immer noch nicht, wie dies Gefahr bedeutet für die Verwendung von SHA-1 als Schlüsselableitungsfunktion. Gibt es im Allgemeinen gute Gründe zu der Annahme, dass ein Kollisionsangriff oder ein zweiter Preimage-Angriff schließlich in einen ersten Preimage-Angriff umgewandelt werden kann?

146
Tgr

Die kurze Antwort auf Ihre Frage lautet: SHA-1 ist so sicher wie möglich. MD5 wäre auch in Ordnung, sogar MD4; aber es könnte einige Investoren nervös machen. Für Public Relations ist es am besten, eine "bessere" Hash-Funktion zu verwenden, z. SHA-256, auch wenn Sie die Ausgabe auf 160 oder 128 Bit verkürzen (um Speicherkosten zu sparen). Einige der SHA-3-Runde-2-Kandidaten scheinen schneller zu sein als SHA-1, obwohl sie vermutlich "sicherer" sind. Sie sind noch ein bisschen neu, also wäre es im Moment sicherer, an SHA-256 oder SHA-512 festzuhalten. Es würde Sie professionell und vorsichtig aussehen lassen, was gut ist.

Beachten Sie, dass "so sicher wie möglich" nicht mit "vollkommen sicher" identisch ist. Unten finden Sie recht ausführliche Erklärungen.

Über bekannte Angriffe:

Bei den bekannten Angriffen auf MD4, MD5 und SHA-1 handelt es sich um Kollisionen, die keinen Einfluss auf die Beständigkeit gegen Vorbilder haben. Es hat sich gezeigt, dass MD4 einige Schwächen aufweist, die (nur theoretisch) ausgenutzt werden können, wenn versucht wird, HMAC/MD4 zu beschädigen. Dies gilt jedoch nicht für Ihr Problem. Die 2106 Der zweite Preimage - Angriff von Kesley und Schneier in der Zeitung ist ein generischer Kompromiss, der nur für sehr lange Eingaben gilt (260 Bytes; Das sind eine Million Terabyte. Beachten Sie, dass 106 + 60 160 überschreiten. das ist, wo Sie sehen, dass der Kompromiss nichts Magisches hat).

Im Rest dieser Nachricht wird davon ausgegangen, dass die von Ihnen verwendete Hash-Funktion (z. B. SHA-1) eine "Black Box" ohne spezielle Eigenschaft ist, die der Angreifer möglicherweise verwendet. Das ist es, was Sie gerade haben, auch mit den "kaputten" Hash-Funktionen MD5 und SHA-1.

Über Rainbow-Tabellen:

Die "Regenbogenattacke" ist eigentlich eine Kostenteilung eines Wörterbuch- oder Brute-Force-Angriffs. Es ist eine Ableitung von Time-Memory-Trade-off , das erstmals 1980 von Hellman beschrieben wurde. Vorausgesetzt, Sie haben [~ # ~] n [~ # ~] mögliche Passwörter (das ist die Größe Ihres Wörterbuchs, oder 2 n Wenn Sie erwägen, eine Hash-Funktion mit einer Ausgabe von n (Bits) brutal zu erzwingen, gibt es einen Time-Sharing-Angriff, bei dem Sie [~ # ~] n [~ vorberechnen # ~] Passwörter gehackt und in einer großen Tabelle gespeichert. Wenn Sie die Hash-Ausgaben sortieren, können Sie Ihr Kennwort in einer einzigen Suche abrufen. A Rainbow table ist eine clevere Methode, um diesen Tisch mit viel weniger Platz zu verstauen. Sie speichern nur N/t gehashte Passwörter, und Sie knacken Passwörter mit O ( t2) Lookups. Mit Rainbow-Tabellen können Sie vorberechnete Tabellen virtuell verarbeiten, die viel größer sind als das, was Sie realistisch speichern können.

Unabhängig davon, ob Rainbow oder nicht, muss der Angreifer den vollständigen Angriff mindestens einmal ausführen. Dies kann als mehrere aufeinander folgende Optimierungsebenen angesehen werden:

  1. Der Brute-Force-/Wörterbuch-Angriff hat [~ # ~] n [~ # ~] für das Knacken jedes Passworts gekostet.
  2. Bei einer vorberechneten Tabelle zahlt der Angreifer die Kosten [~ # ~] n [~ # ~] einmal und kann danach angreifen viele Passwörter mit sehr geringen zusätzlichen Kosten pro Passwort.
  3. Wenn die vorberechnete Tabelle eine Rainbow-Tabelle ist, dann kann [~ # ~] n [~ # ~] etwas größer sein, weil Speicher kostenpflichtig ist reduziert. Der Engpass bei [~ # ~] n [~ # ~] ist die CPU-Leistung, die der Angreifer aufbringen kann, nicht die Größe seiner Festplatten.

If [~ # ~] n [~ # ~] ist groß genug, dass die CPU-Kosten für das Hashing [~ # ~] n [~ # ~] = Kennwörter sind lächerlich, dann ist ein solcher Angriff nicht möglich, unabhängig davon, ob Rainbow-Tabellen verwendet werden oder nicht. Dies bedeutet, dass eine (vorab bildresistente) Hash-Funktion mit einer Ausgabe von 80 Bit oder mehr ausreicht, um einen Brute-Force-Angriff unmöglich zu machen.

Über Salze:

Salze sind eine Möglichkeit, Vorberechnungen zu umgehen. In der obigen Beschreibung bringt das Salt den Angreifer zu Schritt 1 zurück: Salting verhindert, dass der Angreifer die O ( [~ # ~] n [~ # ~]) -Kosten zwischen mehreren angegriffenen Passwörtern teilt . Vorberechnete Tabellen, a fortiori Rainbow-Tabellen, sind nicht mehr machbar.

Sie möchten salzen, weil, wenn die gehashten Daten aus Passwörtern bestehen, dh etwas, das in das Gehirn eines zufälligen Menschen passt, dann [~ # ~] n [~ # ~] kann ziemlich niedrig sein: Menschen sind wirklich schlecht darin, Passwörter zu wählen und sich diese zu merken. Darum geht es bei "Wörterbuchangriffen": Dabei wird ein reduzierter Bereich potenzieller Kennwörter (das "Wörterbuch") verwendet, unter der Annahme, dass sich viele Benutzerkennwörter in diesem speziell ausgewählten Bereich befinden.

Das Salting verhindert daher zumindest, dass der Angreifer vorberechnete Tabellen, insbesondere vorberechnete Rainbow-Tabellen, verwendet. Dies setzt voraus, dass der Angreifer wird in der Lage ist, ein oder zwei Passwörter zu knacken; Wir möchten nicht, dass er 1000 andere Passwörter mit etwas mehr Aufwand knackt.

Auch das Salzen ist gut für die Öffentlichkeitsarbeit.

Über SHA-1 Kosten:

Die elementaren Kosten von SHA-1 betreffen das Hashing eines 64-Byte-Blocks. So funktioniert SHA-1: Daten werden aufgefüllt und dann in 64-Byte-Blöcke aufgeteilt. Die Kosten für die Verarbeitung eines einzelnen Blocks betragen auf einem Intel Core2-System etwa 500 Taktzyklen, und das gilt für einen einzelnen Kern. MD5 und MD4 sind schneller, zählen etwa 400 bzw. 250 Zyklen. Vergessen Sie nicht, dass die meisten modernen CPUs mehrere Kerne haben, also multiplizieren Sie sie entsprechend.

Einige Salzschemata schreiben riesige Salze vor; z.B. Was in die Hash-Funktion eingegeben wird, sind tatsächlich 40000 aufeinanderfolgende Kopien eines einzelnen 128-Bit-Salt, gefolgt vom Kennwort selbst. Dies verteuert das Hashing von Passwörtern (in meinem Beispiel um den Faktor 10000), sowohl für den legitimen Benutzer als auch für den Angreifer. Ob dies eine gute Idee ist, hängt vom Setup ab. Für die Anmeldung auf einem Desktop-System ist dies gut: Der Benutzer merkt nicht einmal, dass es 10 ms gedauert hat, sein Kennwort zu haschen, anstatt 1 us. Die Kosten für den Angreifer sind jedoch um einen beachtlichen Faktor von 10000 gestiegen. Auf gemeinsam genutzten Servern mit Tausenden von Clients pro Sekunde können die Gesamtkosten unerschwinglich werden. Konzeptionell ist eine Erhöhung der Messlatte um denselben Faktor für den legitimen Benutzer und den Angreifer letztendlich keine gute Sicherheit. In bestimmten Situationen kann es sich jedoch lohnen, eine Idee zu haben.

Über Online-Angriffe:

Bei all dem oben genannten geht es darum, offline Angriffe zu besiegen. Ein Offline-Angriff ist ein Angriff, bei dem der Angreifer über alle Daten verfügt, die er zum "Testen" von Kennwörtern benötigt. z.B. Der Angreifer könnte eine Kopie der Datenbank erhalten, die die gehackten Passwörter enthält. Bei einem Offline-Angriff ist der Angreifer nur durch seine Rechenressourcen begrenzt. Umgekehrt ist ein online Angriff ein Angriff, bei dem jede Vermutung des Angreifers einen ehrlichen Verifizierer durchlaufen muss (z. B. versucht der Angreifer einfach, sich auf dem angegriffenen System anzumelden). Online-Angriffe werden verhindert, indem die Anzahl der Passwörter, die pro Sekunde ausprobiert werden können, begrenzt wird. Extreme Beispiele sind Smartcards, die nach drei falschen PINs heruntergefahren werden.

Normalerweise lohnt es sich aus Gründen der Passwortsicherheit viel mehr, das System so einzurichten, dass ein Angreifer keinen Offline-Angriff erstellt. Das ist, was Unix-Systeme tun: Die Hash-Passwörter, die sich früher in der von der Welt lesbaren Datei /etc/password Befanden, befinden sich jetzt in der Datei /etc/shadow, Die vor Lesezugriff geschützt ist, mit Ausnahme einiger weniger privilegierter Benutzer anwendungen. Die Vermutung hier ist, dass der Angreifer, wenn er /etc/shadow Lesen kann, wahrscheinlich genug Kontrolle über das System hat, um wirklich keine Passwörter mehr zu benötigen ...

208
Thomas Pornin

In den vorherigen Antworten wurden keine GPUs erwähnt, die das SHA-1-Hashing insofern parallellieren können, als eine gesamte Datenbank nun brutal in Minuten oder Stunden anstatt Tagen oder Wochen gezwungen werden kann, selbst wenn die Passwörter gesalzen wurden.

Moderne Passwort-Hash-Algorithmen wie bcrypt oder scrypt sind so konzipiert, dass sie auf GPUs nur schwer ausgeführt werden können, da es sich um Blockchiffren mit viel höherem Speicherbedarf handelt (und der Speicherzugriff in einer GPU nicht in gleichem Maße parallelisiert werden kann). Sie haben auch eine "Arbeitsfunktion", die es ihnen ermöglicht, im laufenden Betrieb langsamer zu werden, wenn die Technologie verbessert wird.

Kurz gesagt, Sie sollten nur die besten Werkzeuge für den Job verwenden. Und SHA-1 ist weit hinter dem Stand der Technik zurückgeblieben.

Zur weiteren Lektüre:

30
jammycakes

Ihre Beschreibung entspricht dem aktuellen Stand der Technik.

Sie sollten jedoch nicht eine einzige Iteration einer Hash-Funktion verwenden: Zumindest sollten Sie eine Iteration mehrmals ausführen (1000 Iterationen des Hash erhöhen die Arbeit des Angreifers um das 1000-fache. Es erhöht Ihre Arbeit jedoch um den gleichen Betrag Sie machen viel weniger Passwort-Hashing als sie).

Im Idealfall sollten Sie jedoch ein vorhandenes Grundelement für die Kennwortspeicherung verwenden, z. B. die hier beschriebenen hier .

7
Nick Johnson

SHA1 ist ein Message Digest , es war nie als Passwort gedacht. Hash-Funktion (oder Schlüsselableitung). (Obwohl es ein Baustein für ein KDF sein könnte, wie in PBKDF2 mit HMAC-SHA1.)

Eine Passwort-Hashing-Funktion sollte sich gegen Wörterbuchangriffe und Rainbow-Tabellen schützen. Mehrere Algorithmen wurden entwickelt, um dieses Ziel zu erreichen.

Derzeit ist wahrscheinlich Argon2 die beste Wahl. Diese Familie von Passwort-Hashing-Funktionen hat den Password Hashing-Wettbewerb im Jahr 2015 gewonnen.

Wenn Argon2 nicht verfügbar ist, ist die einzige andere standardisierte Passwort-Hashing- oder Schlüsselableitungsfunktion PBKDF2, ein alter NIST-Standard. Andere Auswahlmöglichkeiten, wenn die Verwendung eines Standards nicht erforderlich ist, umfassen bcrypt und scrypt.

Wikipedia hat Seiten für diese Funktionen:

7
Erwan Legrand

In SHA-1 wurden schwerwiegende Sicherheitslücken entdeckt, durch die die Suche viel schneller als mit brachialer Gewalt durchgeführt werden kann. Es ist immer noch weitgehend unlösbar, aber es wird nicht erwartet, dass dies zu lange der Fall ist. Paranoide Programmierer bevorzugen etwas aus der SHA-2-Familie.

Von dieser Artikel in Bezug auf das ursprüngliche Ergebnis von 2005:

"Es ist Zeit zu den Feuerausgängen zu laufen, aber nicht zu rennen. Sie sehen keinen Rauch, aber der Feueralarm ist los."

Es ist nicht so, dass die aktuelle Kryptoanalyse SHA-1 unsicher macht, sondern dass die Krypto-Community befürchtet, dass schlimmere Nachrichten gleich vor der Tür stehen könnten. Diese Befürchtung gilt auch für SHA-2, das die gleichen Mängel aufweist wie SHA-1, wenn auch über einen viel größeren Suchraum, daher die fortlaufende Suche nach SHA- .

Kurz gesagt, SHA-1 ist derzeit in Sicherheit und wird wahrscheinlich noch einige Zeit in Gebrauch sein, aber die Kryptogemeinschaft ist mit der Prognose nicht einverstanden.

4
Marcelo Cantos

Ab Februar 2017 sollte SHA-1 nicht mehr als sicher eingestuft werden. Google hat Erfolge mit Kollisionsangriffen gegen die vollständige, nicht reduzierte Runde SHA-1 gemeldet ( Link zum Bericht ). Für die Ankündigung von Google hier klicken .

Bearbeiten: Wie bereits erwähnt, sind Kennwörter nicht anfällig für Hash-Kollisionsangriffe. Als allgemeine Richtlinie würde ich jedoch SHA-1 für sicherheitsrelevante Anwendungen nicht wählen. Es gibt bessere Alternativen.

4
Aaron

Wenn Sie das gesalzene Passwort speichern, ist SHA-1 für praktische Zwecke in Ordnung. SHA-2 gilt als sicherer, aber SHA-1 ist kein Problem, es sei denn, Sie haben einen Grund, wirklich paranoid zu sein.

Hier ist was NIST sagt :

Die bisherigen Ergebnisse zu SHA-1 stellen dessen Sicherheit nicht in Frage. Aufgrund der technologischen Fortschritte plant NIST, SHA-1 bis 2010 zu Gunsten der größeren und stärkeren Hash-Funktionen (SHA-224, SHA-256, SHA-384 und SHA-512) auslaufen zu lassen.

3
VladV