it-swarm.com.de

Wie lange braucht man, um einen gesalzenen SHA-512-Hasch zu erzwingen? (Salz zur Verfügung gestellt)

Hier ist ein Algorithmus in Java:

public String getHash(String password, String salt) throws Exception {
    String input = password + salt;
    MessageDigest md = MessageDigest.getInstance(SHA-512);
    byte[] out = md.digest(input.getBytes());
    return HexEncoder.toHex(out);
}

Angenommen, das Salz ist bekannt. Ich möchte wissen, wann es Zeit ist, Gewalt anzuwenden, wenn es sich bei dem Passwort um ein Wörterbuchwort handelt und auch, wenn es sich nicht um ein Wörterbuchwort handelt.

54
timothyjc

In Ihrem Fall entspricht das Aufheben des Hash-Algorithmus dem Auffinden einer Kollision im Hash-Algorithmus. Das heißt, Sie müssen das Passwort nicht selbst finden (was ein Preimage-Angriff wäre), Sie müssen nur eine Ausgabe der Hash-Funktion finden das ist gleich dem Hash eines gültigen Passwortes (also "Kollision"). Das Auffinden einer Kollision mit einem Geburtstagsangriff dauert O (2 ^ (n/2)) Zeit, wobei n die Ausgabelänge der Hash-Funktion in Bits ist .

SHA-2 hat eine Ausgabegröße von 512 Bit. Das Auffinden einer Kollision würde also O (2 ^ 256) Zeit in Anspruch nehmen. Angesichts der Tatsache, dass es keine cleveren Angriffe auf den Algorithmus selbst gibt (derzeit sind keine bekannt für die SHA-2-Hash-Familie), ist dies das, was erforderlich ist, um den Algorithmus zu brechen.

Ein Gefühl dafür zu bekommen, was 2 ^ 256 eigentlich bedeutet: Derzeit wird angenommen, dass die Anzahl der Atome im (gesamten !!!) Universum ungefähr 10 ^ 80 beträgt, was ungefähr 2 ^ 266 entspricht. Unter der Annahme einer 32-Byte-Eingabe (was für Ihren Fall angemessen ist - 20 Byte Salt + 12 Byte Passwort) benötigt mein Computer ~ 0,22s (~ 2 ^ -2s) für 65536 (= 2 ^ 16) Berechnungen. Also würden 2 ^ 256 Berechnungen in 2 ^ 240 * 2 ^ 16 Berechnungen durchgeführt, die dauern würden

2^240 * 2^-2 = 2^238 ~ 10^72s ~ 3,17 * 10^64 years

Selbst das Millionen von Jahren zu nennen, ist lächerlich. Und mit der schnellsten Hardware der Welt, die Tausende von Hashes gleichzeitig verarbeitet, wird es nicht viel besser. Keine menschliche Technologie wird in der Lage sein, aus dieser Zahl etwas Akzeptables zu machen.

Also vergessen Sie hier das brachiale Erzwingen von SHA-256. Ihre nächste Frage betraf Wörterbuchwörter. Um solche schwachen Passwörter abzurufen , wurden traditionell Rainbow-Tabellen verwendet. Eine Rainbow-Tabelle ist im Allgemeinen nur eine Tabelle mit vorberechneten Hashwerten. Wenn Sie jeden möglichen Hash zusammen mit seiner Eingabe vorberechnen und speichern könnten, bräuchten Sie O(1) nach einem bestimmten Hash zu suchen und ein gültiges Vorbild dafür abzurufen. Natürlich ist dies in der Praxis nicht möglich, da es kein Speichergerät gibt, auf dem so große Datenmengen gespeichert werden können. Dieses Dilemma wird als bezeichnet. Speicher-Zeit-Kompromiss . Da Sie nur so viele Werte speichern können, enthalten typische Rainbow-Tabellen eine Form von Hash-Verkettung mit dazwischenliegenden Reduktionsfunktionen (dies wird im Wikipedia-Artikel ausführlich erläutert) zum Speichern Platzersparnis durch Zeitersparnis.

Salze waren eine Gegenmaßnahme, um solche Rainbow-Tische unmöglich zu machen. Um Angreifer davon abzuhalten, eine Tabelle für ein bestimmtes Salt vorab zu berechnen, wird empfohlen, Salt-Werte pro Benutzer anzuwenden. Da Benutzer jedoch keine sicheren, völlig zufälligen Passwörter verwenden, ist es immer noch überraschend, wie erfolgreich Sie werden, wenn das Salt bekannt ist, und Sie durchlaufen einfach ein großes Wörterbuch mit gängigen Passwörtern in einem einfachen Versuchs- und Irrtumsschema. Die Beziehung zwischen natürlicher Sprache und Zufälligkeit wird als Entropie ausgedrückt. Typische Passwortwahlen weisen im Allgemeinen eine niedrige Entropie auf, wohingegen vollständig zufällige Werte ein Maximum an Entropie enthalten würden.

Die geringe Entropie typischer Kennwörter macht es möglich, dass einer Ihrer Benutzer mit relativ hoher Wahrscheinlichkeit ein Kennwort aus einer relativ kleinen Datenbank allgemeiner Kennwörter verwendet. Wenn Sie nach ihnen googeln, werden Sie Torrent-Links für solche Passwortdatenbanken finden, oft in der Gigabyte-Größenklasse. Der Erfolg mit einem solchen Tool liegt normalerweise im Bereich von Minuten bis Tagen, wenn der Angreifer in keiner Weise eingeschränkt ist.

Aus diesem Grund reicht es im Allgemeinen nicht aus, nur zu hacken und zu salzen. Sie müssen auch andere Sicherheitsmechanismen installieren. Sie sollten eine künstlich verlangsamte entropieverursachende Methode wie PBKDF2 verwenden, die in PKCS # 5 beschrieben ist, und Sie sollten eine Wartezeit für einen bestimmten Benutzer erzwingen, bevor sie auftreten versuchen Sie möglicherweise erneut, ihr Kennwort einzugeben. Ein gutes Schema ist, mit 0,5 s zu beginnen und diese Zeit für jeden fehlgeschlagenen Versuch zu verdoppeln. In den meisten Fällen bemerken Benutzer dies nicht und scheitern im Durchschnitt nicht häufiger als dreimal. Aber es wird jeden böswilligen Außenstehenden, der versucht, Ihre Anwendung anzugreifen, erheblich verlangsamen.

115
emboss

Ich möchte wissen, wann es Zeit ist, Gewalt anzuwenden, wenn das Passwort ein Wörterbuchwort ist und auch, wenn es kein Wörterbuchwort ist.

Wörterbuch Passwort

Ballpark figure: Es gibt ungefähr 1.000.000 englische Wörter, und wenn ein Hacker ungefähr 10.000 SHA-512-Hashes berechnen kann, wird ein zweites Update durchgeführt: siehe Kommentar von CodesInChaos, diese Schätzung ist sehr niedrig), 1.000.000/10.000 = 100 Sekunden . Es würde also etwas mehr als eine Minute dauern, ein Kennwort für ein einzelnes Wortwörterbuch für einen einzelnen Benutzer zu knacken. Wenn der Benutzer zwei Wörterbuchwörter verkettet, sind Sie im Bereich einiger Tage, aber noch sehr möglich, wenn der Angreifer genug interessiert ist. Mehr als das und es wird hart.

Zufälliges Passwort

Wenn das Passwort eine wirklich zufällige Folge von alphanumerischen Zeichen in Groß- und Kleinschreibung ist, dann beträgt die Anzahl der möglichen Passwörter der Länge N 60 ^ N (Es gibt 60 mögliche Zeichen). Wir berechnen diesmal in die andere Richtung. Wir werden fragen: Welche Länge des Passworts könnten wir bei einer bestimmten Zeitspanne knacken? Verwenden Sie einfach diese Formel:

N = Log60(t * 10,000) wobei t die Zeit ist, die für die Berechnung von Hashes in Sekunden aufgewendet wurde (wobei wiederum 10.000 Hashes pro Sekunde angenommen werden).

1 minute:    3.2
5 minute:    3.6
30 minutes:  4.1
2 hours:     4.4
3 days:      5.2

Wenn wir also 3 Tage Zeit haben, können wir das Passwort knacken, wenn es 5 Zeichen lang ist.

Das ist alles sehr ball-park, aber Sie bekommen die Idee. Update: siehe Kommentar unten, es ist tatsächlich möglich, viel längere Passwörter als diese zu knacken.

Was ist hier los?

Klären wir einige Missverständnisse auf:

  • Das Salt macht es nicht langsamer, Hashes zu berechnen , es bedeutet nur, dass jedes Benutzerpasswort einzeln geknackt und Hash-Tabellen (Buzz) vorberechnet werden müssen -Wort: Regenbogentabellen) sind völlig unbrauchbar gemacht. Wenn Sie keine vorberechnete Hash-Tabelle haben und nur einen Passwort-Hash knacken, macht Salting keinen Unterschied.

  • SHA-512 ist nicht so konzipiert, dass es schwer zu brachialisieren ist . Bessere Hashing-Algorithmen wie BCrypt, PBKDF2 oder SCrypt können so konfiguriert werden, dass die Berechnung viel länger dauert, und ein durchschnittlicher Computer kann möglicherweise nur 10-20 berechnen hasht eine Sekunde. Lesen Sie Diese ausgezeichnete Antwort über Passwort-Hashing, wenn Sie es noch nicht getan haben.

  • Update: Wie in dem Kommentar von CodesInChaos geschrieben, können selbst Passwörter mit hoher Entropie (ca. 10 Zeichen) brutal werden, wenn die richtige Hardware zur Berechnung von SHA-512-Hashes verwendet wird.


Anmerkungen zur akzeptierten Antwort:

Die akzeptierte Antwort vom September 2014 ist falsch und gefährlich falsch:

In Ihrem Fall entspricht das Aufheben des Hash-Algorithmus dem Auffinden einer Kollision im Hash-Algorithmus. Das bedeutet, dass Sie das Kennwort nicht selbst suchen müssen (was ein Preimage-Angriff wäre). Das Auffinden einer Kollision mithilfe eines Geburtstagsangriffs dauert O (2 ^ n/2) Mal, wobei n die Ausgabelänge des Hash ist Funktion in Bits.

Der Geburtstagsangriff ist völlig irrelevant, um einen bestimmten Hash zu knacken. Und das ist in der Tat ein perfektes Beispiel für einen Preimage-Angriff. Diese Formel und die nächsten Absätze führen zu gefährlich hohen und völlig bedeutungslosen Werten für eine Angriffszeit. Wie oben gezeigt ist es durchaus möglich, gesalzene Wörterbuch-Passwörter in Minuten zu knacken.

Die geringe Entropie typischer Passwörter macht es möglich, dass einer Ihrer Benutzer mit relativ hoher Wahrscheinlichkeit ein Passwort aus einer relativ kleinen Datenbank gängiger Passwörter verwendet ...

Aus diesem Grund reicht es im Allgemeinen nicht aus, nur zu hacken und zu salzen. Sie müssen auch andere Sicherheitsmechanismen installieren. Sie sollten eine künstlich verlangsamte entropieverursachende Methode wie PBKDF2 verwenden, die in PKCS # 5 beschrieben ist.

Ja, bitte verwenden Sie einen Algorithmus, der langsam zu berechnen ist, aber was ist "entropie-enduzierend"? Wenn Sie ein Passwort für niedrige Entropie durch einen Hash setzen, wird die Entropie nicht erhöht. Es sollte preserve Entropie sein, aber mit einem Hash kann man kein Müllpasswort besser machen, so funktioniert es nicht. Ein schwaches Passwort, das über PBKDF2 eingegeben wurde, ist immer noch ein schwaches Passwort.

32
George Powell

Es gibt keine einzige Antwort auf diese Frage, da es zu viele Variablen gibt, aber SHA2 ist noch nicht wirklich geknackt (siehe: Lebensdauer von kryptografischen Hash-Funktionen ), daher ist es immer noch ein guter Algorithmus Speichern Sie Passwörter in. Die Verwendung von Salt ist gut, da es Angriffe durch Wörterbuchangriffe oder Rainbow-Tabellen verhindert. Die Bedeutung eines Salzes ist, dass es für jedes Passwort eindeutig sein sollte. Sie können ein Format wie [128-Bit-Salt] [512-Bit-Kennwort-Hash] verwenden, wenn Sie die gehashten Kennwörter speichern.

Der einzige gangbare Weg, um anzugreifen, besteht darin, Hashes für verschiedene Möglichkeiten des Passworts zu berechnen und schließlich den richtigen zu finden, indem die Hashes abgeglichen werden.

Um eine Vorstellung davon zu geben, wie viele Hashes pro Sekunde durchgeführt werden können, ist Bitcoin meines Erachtens ein gutes Beispiel. Bitcoin verwendet SHA256 und um es kurz zu machen, je mehr Hashes Sie generieren, desto mehr Bitcoins erhalten Sie (die Sie gegen echtes Geld eintauschen können) und als solche sind die Leute motiviert, GPUs für diesen Zweck zu verwenden. Sie können in der Hardwareübersicht sehen, dass eine durchschnittliche Grafikkarte, die nur 150 US-Dollar kostet, mehr als 200 Millionen Hashes/s berechnen kann. Je länger und komplexer Ihr Passwort ist, desto länger dauert es. Das Berechnen mit 200 M/s, um alle Möglichkeiten für eine 8-stellige alphanumerische Zahl (Groß-/Kleinbuchstaben, Zahlen) auszuprobieren, dauert ungefähr 300 Stunden. Die Echtzeit wird höchstwahrscheinlich kürzer sein, wenn das Passwort in Frage kommt oder ein allgemeines englisches Wort ist.

Als solche mit etwas Sicherheit, die Sie im Kontext betrachten müssen. Was ist die Motivation des Angreifers? Was ist die Art der Bewerbung? Ein Hash mit zufälligen Salt-Werten bietet einen recht guten Schutz gegen Fälle, in denen Tausende von Passwörtern kompromittiert werden.

Sie können auch einen zusätzlichen Brute-Force-Schutz hinzufügen, indem Sie Verlangsamung das Hashing-Verfahren verlangsamen. Da Sie Passwörter nur einmal hashen und der Angreifer dies viele Male tun muss, wirkt sich dies zu Ihren Gunsten aus. Die typische Vorgehensweise besteht darin, einen Wert zu nehmen, ihn zu haschen, die Ausgabe zu nehmen, ihn erneut zu haschen usw. für eine feste Anzahl von Iterationen. Sie können beispielsweise 1.000 oder 10.000 Iterationen ausprobieren. Dadurch kann der Angreifer jedes Kennwort um ein Vielfaches langsamer finden.

8
Can Gencer