Warum machen Salze Wörterbuchangriffe "unmöglich"?

85

Update: Bitte beachten Sie, dass ich nicht frage, was ein Salz ist, was ein Regenbogentisch ist, was ein Wörterbuchangriff ist oder was der Zweck eines Salzes ist. Ich frage: Wenn Sie wissen, dass die Benutzer Salt und Hash sind, ist es nicht ganz einfach, ihr Passwort zu berechnen?

Ich verstehe den Prozess und implementiere ihn selbst in einigen meiner Projekte.

s =  random salt
storedPassword = sha1(password + s)

In der Datenbank, die Sie speichern:

username | hashed_password | salt

Jede Implementierung von Salting, die ich gesehen habe, fügt das Salt entweder am Ende des Passworts oder am Anfang hinzu:

hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)

Daher würde ein Wörterbuchangriff eines Hackers, der sein Salz wert ist (ha ha), einfach jedes Schlüsselwort gegen die gespeicherten Salze in den oben aufgeführten allgemeinen Kombinationen ausführen.

Sicherlich fügt die oben beschriebene Implementierung dem Hacker einfach einen weiteren Schritt hinzu, ohne das zugrunde liegende Problem tatsächlich zu lösen. Welche Alternativen gibt es, um dieses Problem zu umgehen, oder verstehe ich das Problem falsch?

Das einzige, was ich mir vorstellen kann, ist ein geheimer Mischalgorithmus, der das Salt und das Passwort in einem zufälligen Muster zusammenfügt oder andere Benutzerfelder zum Hashing-Prozess hinzufügt, was bedeutet, dass der Hacker Zugriff auf die Datenbank UND den Code haben muss, um zu schnüren sie für einen Wörterbuchangriff, um sich als fruchtbar zu erweisen. (Update, wie in den Kommentaren erwähnt, ist am besten anzunehmen, dass der Hacker Zugriff auf alle Ihre Informationen hat, so dass dies wahrscheinlich nicht das Beste ist).

Lassen Sie mich ein Beispiel geben, wie ich vorschlage, dass ein Hacker eine Benutzerdatenbank mit einer Liste von Passwörtern und Hashes hackt:

Daten aus unserer gehackten Datenbank:

RawPassword (not stored)  |  Hashed   |     Salt
--------------------------------------------------------
letmein                       WEFLS...       WEFOJFOFO...

Allgemeines Passwortwörterbuch:

   Common Password
   --------------
   letmein
   12345
   ...

Schleifen Sie für jeden Benutzerdatensatz die allgemeinen Kennwörter und hacken Sie sie:

for each user in hacked_DB

    salt = users_salt
    hashed_pw = users_hashed_password

    for each common_password

        testhash = sha1(common_password + salt)
        if testhash = hashed_pw then
           //Match!  Users password = common_password
           //Lets visit the webpage and login now.
        end if

    next

next

Ich hoffe, das verdeutlicht meinen Standpunkt viel besser.

Bei 10.000 gängigen Kennwörtern und 10.000 Benutzerdatensätzen müssten wir 100.000.000 Hashes berechnen, um so viele Benutzerkennwörter wie möglich zu ermitteln. Es kann einige Stunden dauern, aber es ist nicht wirklich ein Problem.

Update zur Cracking-Theorie

Wir gehen davon aus, dass wir ein korrupter Webhost sind, der Zugriff auf eine Datenbank mit SHA1-Hashes und -Salzen sowie auf Ihren Algorithmus zum Mischen hat. Die Datenbank enthält 10.000 Benutzerdatensätze.

Diese Site behauptet, mit der GPU 2.300.000.000 SHA1-Hashes pro Sekunde berechnen zu können. (In der realen Welt wird die Situation wahrscheinlich langsamer sein, aber im Moment werden wir diese zitierte Zahl verwenden).

(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 Sekunden

Bei einem vollen Bereich von 95 druckbaren ASCII-Zeichen mit einer maximalen Länge von 4 Zeichen, geteilt durch die Berechnungsrate (variabel), geteilt durch 2 (vorausgesetzt, die durchschnittliche Zeit zum Erkennen des Kennworts erfordert durchschnittlich 50% der Permutationen) für 10.000 Benutzer Es würde 177 Sekunden dauern, um alle Benutzerkennwörter mit einer Länge von <= 4 zu ermitteln.

Passen wir es ein wenig an den Realismus an.

(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 Tage

Unter der Annahme, dass die Groß- und Kleinschreibung nicht beachtet wird, mit einer Kennwortlänge <= 7 und nur alphanumerischen Zeichen, würde die Lösung von 10.000 Benutzerdatensätzen 4 Tage dauern, und ich habe die Geschwindigkeit des Algorithmus halbiert, um den Overhead und nicht ideale Umstände widerzuspiegeln.

Es ist wichtig zu erkennen, dass dies ein linearer Brute-Force-Angriff ist. Alle Berechnungen sind unabhängig voneinander. Daher ist es eine perfekte Aufgabe, mehrere Systeme zu lösen. (IE einfach, 2 Computer einzurichten, auf denen Angriffe von verschiedenen Seiten ausgeführt werden, was die Hälfte der Ausführungszeit bedeuten würde).

In Anbetracht des Falls, ein Passwort 1.000 Mal rekursiv zu hashen, um diese Aufgabe rechenintensiver zu machen:

(((36 ^ 7) / 1 000 000 000) / 2) * 1000 Sekunden = 10,8839117 Stunden

Dies entspricht einer maximalen Länge von 7 alphanumerischen Zeichen bei einer Ausführung mit weniger als der halben Geschwindigkeit aus der angegebenen Zahl für einen Benutzer .

Rekursives 1000-maliges Hashing blockiert effektiv einen pauschalen Angriff, aber gezielte Angriffe auf Benutzerdaten sind immer noch anfällig.

Tom Gullen
quelle
12
Der springende Punkt beim Salzen ist, zu verhindern, dass Sie das Hash-Passwort anzeigen und feststellen können, dass mehrere Benutzer denselben Hash (und damit dasselbe Passwort) haben. Ohne Salting könnten Sie einfach den Hashing-Algorithmus verwenden und jeden möglichen Hash generieren und dann eine brutale Suche nach diesem Hash durchführen. Da sich der Algorithmus nie ändert, ist er für Angreifer vorhersehbar. Durch das Salzen wird er nur noch schwieriger.
BeRecursive
25
Weil Cracker wie Schnecken sind und das Salz den Schleim auf ihrer Haut austrocknet und sie tötet.
TED
6
@ Ted: Ich mag eher gesalzene Cracker. Gesalzene Schnecken, nicht so sehr.
FrustratedWithFormsDesigner
3
@ Tom - in Ihrem Beispiel Angriff. Wenn es kein Salt gibt, kann der Angreifer "für jedes gemeinsame Passwort das Passwort hashen. Entspricht dies einem oder mehreren Benutzern? Ja, ich habe ihr Passwort" - der Angreifer kann alle Passwörter "parallel" angreifen. ohne zusätzliche Kosten.
Damien_The_Unbeliever
3
@ Tom Gullen - du hast nur die Hälfte des Bildes. Ohne Salz würde ein Angreifer die in "Update 2" demonstrierte Methode nicht verwenden. Er würde einfach in einer Tabelle nachschlagen und das Passwort in O (1) oder O (log n) erhalten (n ist die Anzahl der Kandidatenpasswörter). Salz verhindert dies und zwingt ihn, den von Ihnen demonstrierten O (n) -Ansatz zu verwenden. Eine andere Technik (Schlüsselverstärkung) kann dazu führen, dass jeder Versuch in Ihrer Schleife eine volle Sekunde dauert, was bedeutet, dass die Durchführung dieser Tests 3 Jahre dauert ... und mit nur 10.000 Passwörtern werden Sie wahrscheinlich keine Passwörter knacken Zeit.
Erickson

Antworten:

31

Ja, Sie benötigen nur 3 Tage für sha1 (salt | password). Aus diesem Grund verwenden gute Kennwortspeicheralgorithmen 1000-Iterations-Hashing: Sie benötigen 8 Jahre.

Flamme
quelle
3
+1, am prägnantesten und auf den Punkt Antwort bisher, war mir nicht bewusst, dass dies eine Option war.
Tom Gullen
Anscheinend haben Sie noch nie einen Hash-Benchmark auf Ihrem System durchgeführt. Sie können VIELE MILLIONEN sha1-Berechnungen pro Sekunde durchführen. 1.000 Runden sind für einen Angreifer bedeutungslos. Auch -1, weil sha1 eine kaputte Hash-Funktion ist.
Turm
Anscheinend verwende ich Namen und Nummern aus Frage. Wenn Sie jemals von so etwas wie Thema und Klarheit gehört haben ... oh, es ist Rook. Keine Ursache.
Flamme
1
@Rook, 1.000 Runden bedeuten, dass die Brute Force 1.000 Mal länger dauert. Scheint mir ein gutes Feature zu sein.
Tom Gullen
Wenn ein Angreifer ein Passwort erraten kann, ist dies dasselbe für die Anmeldung (oder etwas, das mir entgangen ist? lol)
khaled_webdev
62

Es stoppt keine Wörterbuchangriffe.

Was es tut, ist zu verhindern, dass jemand, der es schafft, eine Kopie Ihrer Passwortdatei zu erhalten, eine Regenbogentabelle verwendet, um herauszufinden, welche Passwörter aus den Hashes stammen.

Letztendlich kann es jedoch brutal erzwungen werden. Die Antwort auf diesen Teil besteht darin, Ihre Benutzer zu zwingen, keine Wörterbuchwörter als Kennwörter zu verwenden (z. B. Mindestanforderungen an mindestens eine Zahl oder ein Sonderzeichen).

Update :

Ich hätte dies früher erwähnen sollen, aber einige (die meisten?) Passwortsysteme verwenden für jedes Passwort ein anderes Salz, das wahrscheinlich mit dem Passwort selbst gespeichert wird. Dies macht einen einzelnen Regenbogentisch unbrauchbar. Dies ist , wie die UNIX - crypt Bibliothek funktioniert und modernen UNIX-ähnliche Betriebssysteme haben diese Bibliothek mit neuen Hash - Algorithmen erweitert.

Ich weiß, dass die Unterstützung für SHA-256 und SHA-512 in neueren Versionen der GNU-Krypta hinzugefügt wurde.

Powerlord
quelle
17
+1 Salz verhindert, dass vorberechnete Listen von Hashes (Regenbogentabellen) nützlich sind. Der Angreifer muss von vorne beginnen.
Ian Boyd
2
In PHP können Sie die Bibliotheken mcrypt oder bcrypt für eine bessere Verschlüsselung als md5 oder sha1 verwenden. Wenn Sie mit md5 oder sha1 nicht weiterkommen, sollten Sie "strecken", wo Sie das Passwort tausende Male hashen, bevor Sie zu dem gelangen, was in der Datenbank gespeichert ist. Dies hält die Entropie gleich, erhöht jedoch die Zeit zum Berechnen des Hash.
Malfist
2
@ Tom Gullen, welche Artikel liest du? Selbsternannte Experten oder Peer-Review-Artikel in einer wissenschaftlichen Zeitschrift?
Malfist
7
Und es ist Ihr durchschnittlicher Joe-Entwickler, der diese Blog- / Hilfepostings zum Schreiben eines "sicheren" Systems erstellt. Sicherheit kann man nicht nebenbei lernen, sondern erfordert umfangreiches Wissen. Ist es unfair? Wahrscheinlich. Ist es sicher? Bis zu einem Grad. Es gibt Gründe, warum es Sicherheitsexperten gibt. Andererseits muss nicht alles so sicher sein wie Fort Knox. Die beste Strategie besteht darin, ein von diesen Experten entwickeltes vorgefertigtes System zu verwenden und es an Ihre Anforderungen anzupassen.
Malfist
3
@Michael: Bei einem längeren Salz müssen Sie alle möglichen Salzwerte vorberechnen, damit sie in der Regenbogentabelle angezeigt werden. Der Punkt ist, dass Sie nicht für alle Passwörter das gleiche Salz behalten, sondern es zufällig für jedes Passwort auswählen und es in der Datenbank neben dem gespeicherten Hash-Salted-Passwort speichern. Ein Hacker würde also für jedes mögliche Salz mit hohem Wert einen Eintrag in der Regenbogentabelle benötigen, was dazu führen würde, dass die Tabelle zu groß ist, um machbar zu sein, worum es geht.
Colin DeClue
31

Genauer gesagt wird ein Wörterbuchangriff , dh ein Angriff, bei dem alle Wörter in einer vollständigen Liste ausprobiert werden, nicht "unmöglich", aber unpraktisch : Jedes Stück Salz verdoppelt den erforderlichen Speicher- und Rechenaufwand .

Dies unterscheidet sich von vorberechneten Wörterbuchangriffen wie Angriffen mit Regenbogentabellen, bei denen es nicht darauf ankommt, ob das Salz geheim ist oder nicht.

Beispiel: Mit einem 64-Bit-Salt (dh 8 Bytes) müssen Sie 2 64 zusätzliche Kennwortkombinationen in Ihrem Wörterbuchangriff überprüfen . Mit einem Wörterbuch mit 200.000 Wörtern müssen Sie erstellen

200.000 * 2 64 = 3,69 * 10 24

Tests im schlimmsten Fall - statt 200.000 Tests ohne Salz.

Ein zusätzlicher Vorteil der Verwendung von Salt besteht darin, dass ein Angreifer die Kennwort-Hashes aus seinem Wörterbuch nicht vorberechnen kann. Es würde einfach zu viel Zeit und / oder Raum dauern.

Aktualisieren

Bei Ihrem Update wird davon ausgegangen, dass ein Angreifer das Salz bereits kennt (oder es gestohlen hat). Dies ist natürlich eine andere Situation. Dem Angreifer ist es jedoch nicht möglich, eine vorberechnete Regenbogentabelle zu verwenden. Was hier sehr wichtig ist, ist die Geschwindigkeit der Hashing-Funktion. Um einen Angriff unpraktisch zu machen, muss die Hashing-Funktion langsam sein. MD5 oder SHA sind hier keine guten Kandidaten, da sie schnell ausgelegt sind. Bessere Kandidaten für Hashing-Algorithmen sind Blowfish oder einige Variationen davon.

Update 2

Eine gute Lektüre zum Thema Sichern Ihrer Passwort-Hashes im Allgemeinen (weit über die ursprüngliche Frage hinaus, aber immer noch interessant):

Genug mit den Regenbogentabellen: Was Sie über sichere Passwortschemata wissen müssen

Folgerung aus dem Artikel: Verwenden Sie gesalzene Hashes, die mit bcrypt (basierend auf Blowfish) oder Eksblowfish erstellt wurden und die es Ihnen ermöglichen, eine konfigurierbare Rüstzeit zu verwenden, um das Hashing zu verlangsamen.

Dirk Vollmar
quelle
4
@ Tom Gullen - Selbst mit vernünftig strengen Kennwortrichtlinien wird ein Wörterbuch mit Hunderten von Millionen oder einigen Milliarden Kandidaten wahrscheinlich einige Treffer erhalten, da nicht alle Kennwörter gleich wahrscheinlich sind (weil die Benutzer Mnemonics anstelle von RNGs verwenden, um sie auszuwählen). . Ein Wörterbuch dieser Größe ist auf Warensystemen vorberechnbar, wenn kein Salz verwendet wird. Wenn Salz verwendet wird, muss der Angreifer jedes Mal Hashes neu berechnen. Wenn genügend Iterationen des Hash ausgeführt werden, kann die Angriffsrate des Angreifers auf einige Versuche pro Sekunde verlangsamt werden.
Erickson
3
-1 von mir: geheim gehalten zu werden ist absolut nicht der Sinn von Salzen. Sie müssen ohnehin für die Überprüfung von Kennwörtern zugänglich sein. Wenn Sie also versuchen, sie geheim zu halten, wird das System wahrscheinlich durch zusätzliche Komplexität anfälliger, anstatt tatsächlich erfolgreich zu sein.
Michael Borgwardt
2
@ 0xA3: nochmal: einem Angreifer unbekannt zu sein, ist nicht der Sinn eines Salzes . Ihr Computer muss auf irgendeine Weise darauf zugreifen, damit ein Angreifer, der in den Computer einbricht, auch darauf zugreifen kann. Jedes Szenario, in dem der Angreifer das Salz nicht kennt, ist ein roter Hering.
Michael Borgwardt
1
Ich denke, es ist erwähnenswert, dass der verlinkte Artikel Regenbogentabellen falsch beschreibt. Was er beschreibt, ist ein einfaches Wörterbuch. Regenbogentische sind wirklich ganz anders (und etwas komplexer). Es gibt eine ziemlich anständige Erklärung, wie Regenbogentabellen wirklich funktionieren: kestas.kuliukas.com/RainbowTables
Jerry Coffin
3
-1 für "Natürlich muss das Salz geheim gehalten werden". Wenn ein Angreifer Zugriff auf Ihre Passwort-Hashes hat, hat er auch Ihre Salze - was Sie brauchen, sind Salze pro Benutzer , nicht die Sicherheit durch Dunkelheit eines "versteckten" Salzes.
Snemarch
17

Ein Wörterbuch ist eine Struktur, in der Werte durch Schlüssel indiziert werden. Bei einem vorberechneten Wörterbuchangriff ist jeder Schlüssel ein Hash, und der entsprechende Wert ist ein Kennwort, das zum Hash führt. Mit einem vorberechneten Wörterbuch kann ein Angreifer "sofort" nach einem Kennwort suchen, das den erforderlichen Hash für die Anmeldung erzeugt.

Mit Salt wächst der zum Speichern des Wörterbuchs erforderliche Speicherplatz schnell… so schnell, dass der Versuch, ein Kennwortwörterbuch vorab zu berechnen, bald sinnlos wird.

Die besten Salze werden zufällig aus einem kryptografischen Zufallszahlengenerator ausgewählt. Acht Bytes sind eine praktische Größe, und mehr als 16 Bytes haben keinen Zweck.


Salz ist viel mehr als nur "die Arbeit eines Angreifers irritierender zu machen". Es eliminiert eine ganze Angriffsklasse - die Verwendung vorberechneter Wörterbücher.

Ein weiteres Element ist erforderlich, um Passwörter vollständig zu sichern, nämlich die "Schlüsselverstärkung". Eine Runde SHA-1 ist nicht gut genug: Ein sicherer Passwort-Hashing-Algorithmus sollte rechnerisch sehr langsam sein.

Viele Menschen verwenden PBKDF2, eine Schlüsselableitungsfunktion, die die Ergebnisse tausende Male an die Hash-Funktion zurückmeldet . Der "bcrypt" -Algorithmus ist ähnlich und verwendet eine langsame iterative Schlüsselableitung.

Wenn der Hashing-Vorgang sehr langsam ist, wird eine vorberechnete Tabelle für einen Angreifer immer wünschenswerter. Aber richtiges Salz besiegt diesen Ansatz.


Bemerkungen

Unten sind die Kommentare, die ich zu der Frage gemacht habe.


Ohne Salz würde ein Angreifer die in "Update 2" gezeigte Methode nicht verwenden. Er würde einfach eine Suche in einer vorberechneten Tabelle durchführen und das Passwort in O (1) oder O (log n) erhalten (n ist die Anzahl der Kandidatenpasswörter). Salz verhindert dies und zwingt ihn, den in "Update 2" gezeigten O (n) -Ansatz zu verwenden.

Sobald wir auf einen O (n) -Angriff reduziert sind, müssen wir überlegen, wie lange jeder Versuch dauert. Die Schlüsselverstärkung kann dazu führen, dass jeder Versuch in der Schleife eine volle Sekunde dauert. Dies bedeutet, dass die zum Testen von 10.000 Kennwörtern bei 10.000 Benutzern erforderliche Zeit zwischen 3 Tagen und 3 Jahren liegt. Bei nur 10.000 Kennwörtern ist es wahrscheinlich, dass Sie Null knacken Passwörter in dieser Zeit.

Sie müssen berücksichtigen, dass ein Angreifer die schnellsten Tools verwenden wird, die er kann, nicht PHP. Daher wären Tausende von Iterationen anstelle von 100 ein guter Parameter für die Schlüsselverstärkung. Es sollte einen Bruchteil einer Sekunde dauern, bis der Hash für ein einzelnes Kennwort berechnet ist.

Die Schlüsselverstärkung ist Teil der Standard-Schlüsselableitungsalgorithmen PBKDF1 und PBKDF2 von PKCS # 5, die großartige Algorithmen zur Verschleierung von Passwörtern erstellen (der "abgeleitete Schlüssel" ist der "Hash").

Viele Benutzer von StackOverflow verweisen auf diesen Artikel, da er eine Antwort auf Jeff Atwoods Beitrag über die Gefahren von Regenbogentabellen war. Es ist nicht mein Lieblingsartikel, aber er behandelt diese Konzepte ausführlicher.


Natürlich nehmen Sie an, dass der Angreifer alles hat: Salt, Hash, Benutzername. Angenommen, der Angreifer ist ein korrupter Mitarbeiter eines Hosting-Unternehmens, der die Benutzertabelle auf Ihrer myprettypony.com-Fansite gelöscht hat. Er versucht, diese Passwörter wiederherzustellen, weil er sich umdrehen und prüfen wird, ob Ihre Ponyfans dasselbe Passwort für ihre citibank.com-Konten verwendet haben.

Mit einem gut gestalteten Passwort - Schema, wird es unmöglich für diese Typen keine Passwörter wiederherzustellen.

erickson
quelle
1
Ich denke, dass Tom unter "Wörterbuchangriff" das Ausprobieren bekannter schwacher Passwörter (dh direkt aus einem Wörterbuch in menschlicher Sprache) versteht, nicht vorberechnete Hash-Klartext-Tabellen - daran denke ich auch zuerst, wenn ich "Wörterbuch" lese dieser Kontext.
Michael Borgwardt
@Michael Borgwardt: Ich stimme zu, @erickson bezieht sich auf vorberechnete Wörterbuchangriffe.
Dirk Vollmar
1
Salt stoppt vorberechnete Wörterbuchangriffe. Durch die Schlüsselverstärkung werden Wörterbuchangriffe gestoppt. Beide müssen zusammen für eine sichere Kennwortauthentifizierung verwendet werden.
Erickson
Ich meine einfache englische Tabellen ja. Die Frage zielt darauf ab, das Problem anzugehen, wie ein Hacker daran gehindert werden kann, alle möglichen Kombinationen von Hashes für jedes Benutzerkonto auszuarbeiten
Tom Gullen,
7

Der Punkt des Salzens besteht darin, die Amortisation der Anstrengung des Angreifers zu verhindern.

Ohne Salt kann eine einzelne Tabelle mit vorberechneten Hash-Passworteinträgen (z. B. MD5 aller alphanumerischen 5-Zeichenfolgen, die online leicht zu finden sind) für jeden Benutzer in jeder Datenbank der Welt verwendet werden.

Mit einem ortsspezifischen Salt muss der Angreifer die Tabelle selbst berechnen und kann sie dann für alle Benutzer der Site verwenden.

Mit einem Salz pro Benutzer muss der Angreifer diesen Aufwand für jeden Benutzer separat aufwenden.

Natürlich trägt dies nicht viel dazu bei, wirklich schwache Passwörter direkt aus einem Wörterbuch heraus zu schützen, aber es schützt einigermaßen starke Passwörter vor dieser Amortisation.

Michael Borgwardt
quelle
1
Kurze und präzise Antwort - es lohnt sich hinzuzufügen, dass Sie ohne Salz oder mit Salz auf der gesamten Website Benutzer mit demselben Passwort leicht erkennen können und nur eines brutal erzwingen müssen. Mit Salzen pro Benutzer können Sie das nicht tun.
Snemarch
6

Außerdem - ein weiterer wichtiger Punkt - verhindert die Verwendung eines USER-spezifischen Salt die Erkennung von zwei Benutzern mit dem gleichen Kennwort - ihre Hashes würden übereinstimmen. Deshalb ist der Hash oft Hash (Salt + Benutzername + Passwort)

Wenn Sie versuchen, den Hash geheim zu halten, kann der Angreifer die Hashes auch nicht überprüfen.

Bearbeiten - habe gerade bemerkt, dass der Hauptpunkt in einem Kommentar oben gemacht wurde.

Dominik Weber
quelle
1
Sie sollten bearbeiten, um das Salz pro Benutzer anzugeben. Auf Websites, die ein Site-weites Salt verwenden, können Sie weiterhin identische Kennwörter erkennen.
Snemarch
@snemarch - Ja, vielen Dank für diese wichtige Unterscheidung!
Dominik Weber
5

Salze werden eingesetzt, um Regenbogentischangriffe zu verhindern. Eine Regenbogentabelle ist eine Liste vorberechneter Hashes, wodurch die Übersetzung eines Hashs in seine Phrase viel einfacher wird. Sie müssen verstehen, dass das Salzen als moderne Vorbeugung gegen das Knacken eines Passworts nur dann wirksam ist, wenn wir ein modernes Hashing-Algo haben.

So können sagen wir mit SHA1 arbeiten, die Vorteile der jüngsten Exploits mit dieser algo entdeckt nehmen, und können sagen , wir haben einen Computer , auf 1.000.000 Hashes laufen / Sekunde, würde es 5,3 Millionen Millionen Millionen Jahre dauern , um eine Kollision zu finden , so yeah php kann 300 pro Sekunde arbeiten, große Woop, spielt keine Rolle. Der Grund, warum wir salzen, ist, dass sich jemand die Mühe gemacht hat, alle gängigen Wörterbuchphrasen zu generieren (2 ^ 160 Personen, willkommen zu den Exploits der Ära 2007).

Hier ist also eine aktuelle Datenbank mit 2 Benutzern, die ich zu Test- und Verwaltungszwecken verwende.

RegistrationTime        UserName        UserPass    
1280185359.365591       briang      a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087       test        5872548f2abfef8cb729cac14bc979462798d023

Tatsächlich ist das Salzschema Ihr sha1 (Registrierungszeit + Benutzername). Sagen Sie mir mein Passwort, dies sind echte Passwörter in der Produktion. Sie können sogar dort sitzen und eine Wortliste in PHP raushacken. Dreh durch.

Ich bin nicht verrückt, ich weiß nur, dass dies sicher ist. Aus Spaß ist das Passwort des Tests test. sha1(sha1(1281546174.065087 + test) + test) = 5872548f2abfef8cb729cac14bc979462798d023

Sie müssten nur27662aee8eee1cb5ab4917b09bdba31d091ab732 für diesen Benutzer eine komplette Regenbogentabelle erstellen . Das heißt, ich kann tatsächlich zulassen, dass meine Passwörter nicht alle durch eine einzelne Regenbogentabelle kompromittiert werden. Der Hacker muss eine vollständige Regenbogentabelle für 27662aee8eee1cb5ab4917b09bdba31d091ab732 für den Test und erneut f3f7735311217529f2e020468004a2aa5b3dee7 generieren. Denken Sie an die 5,3 Millionen Millionen Jahre für alle Hashes zurück. Denken Sie an die Größe der Speicherung nur der 2 ^ 80 Hashes (das sind weit über 20 Yottabyte ), es wird nicht passieren.

Verwechseln Sie das Salzen nicht, um einen Hash zu etwas zu machen, das Sie niemals entschlüsseln können. Es verhindert, dass eine Regenbogentabelle alle Ihre Benutzerkennwörter übersetzt . Auf diesem technologischen Niveau ist es unmöglich.

Inkognito
quelle
Ich verstehe, was ein Regenbogentisch ist, aber Sie verpassen den Punkt meiner Frage. Wenn Sie mir Ihren Salting-Algorithmus, ein Hash-Passwort und das Salt zur Verfügung gestellt haben, könnte ich Ihnen wahrscheinlich innerhalb weniger Minuten sagen, wie Ihr Passwort lautet.
Tom Gullen
Legen Sie Ihr Geld, wo Ihr Mund ist?
Inkognito
Sicher, aber Sie haben mir gerade gesagt, wie das Passwort in Ihrem Beispiel lautet. Geben Sie mir ein Salt, ein Hash-Passwort und wie Sie das Salt + Passwort kombinieren (nicht rekursiv) und solange das Passwort <= 5 alphanumerische Kleinbuchstaben (kein Leerzeichen /) ist. Sonderzeichen) Ich werde Sie wissen lassen, was es in dieser Box ist. Wenn Sie möchten, dass ich Geld darauf lege, wie Sie es vorschlagen, lassen Sie es mich wissen, obwohl mein Kommentar von ein paar Minuten wahrscheinlich eine grobe Unterschätzung ist, aber innerhalb von Stunden ja.
Tom Gullen
1
Vielleicht Sekunden tatsächlich, siehe golubev.com/hashgpu.htm, das die GPU verwendet, um die angegebenen "2300M / s SHA1-Hashes pro Sekunde" zu berechnen. Mit einem vollen Bereich von 95 ASCII-Zeichen von 1-6 Zeichen können wir es in <6 Minuten knacken. Wenn wir nur alphanumerische Kleinbuchstaben haben, sind bis zu 8 Zeichen <25 Minuten lang. Mit einer Datenbank von 10.000 Benutzerdatensätzen konnten wir alle 4 char-vollständigen ASCII-Passwörter in <200 Sekunden ((((95 ^ 4) / 2300000000) / 2) * 10000) finden. (Mehr Overhead als angegeben und angegebene GPU-Geschwindigkeiten sind wahrscheinlich ideale Situationen).
Tom Gullen
Ja, das Salzen hindert Sie nicht daran, dieses Passwort brutal zu erzwingen. Es macht es für Sie schwieriger, ((10 ^ 5) * (94 ^ 10)) = 10 ^ 24 zu generieren, wenn Benutzer Kennwörter mit etwa 10 Zeichen haben, was viel schwieriger ist als die 10 ^ 19 ohne Hashes. Auch hier geht es nicht darum, das Brechen eines Passworts zu erschweren, sondern darum, das Brechen aller Passwörter mit einer vorverarbeiteten Regenbogentabelle unmöglich zu machen. (und überprüfen Sie meine Mathematik hier, aber ich glaube 10 ^ 25/2300000000/60/60/24/365/1000 = 137 869 ~ milinea für jedermanns Passwort). Wenn wir stärkere Passwörter wollen, die wir nicht salzen, verwenden wir Dinge wie den Diffie-Hellman-Schlüsselaustausch.
Inkognito
3

Die Idee hinter dem Wörterbuchangriff ist, dass Sie einen Hash nehmen und das Passwort finden, aus dem dieser Hash berechnet wurde, ohne Hash-Berechnung. Machen Sie jetzt dasselbe mit gesalzenem Passwort - das können Sie nicht.

Wenn Sie kein Salt verwenden, ist die Kennwortsuche so einfach wie das Nachschlagen in der Datenbank. Durch Hinzufügen eines Salzes führt der Angreifer eine Hash-Berechnung aller möglichen Passwörter durch (selbst beim Anhängen eines Wörterbuchs erhöht dies die Angriffszeit erheblich).

Eugene Mayevskis Rückruf
quelle
In dem Szenario der OP, der Angreifer hat die Salze aus der Datenbank und wird mit jedem Eintrag jedes Salz versuchen , haben im „Wörterbuch“. ...Meiner Ansicht nach.
FrustratedWithFormsDesigner
2

Im einfachsten Sinne: Ohne Salting muss jedes Kandidatenkennwort nur einmal gehasht werden, um es mit jedem Benutzer im "bekannten Universum" (Sammlung kompromittierter Datenbanken) zu vergleichen, dessen Kennwort über denselben Algorithmus gehasht wird. Wenn beim Salting die Anzahl der möglichen Salt-Werte die Anzahl der Benutzer im "bekannten Universum" erheblich überschreitet, muss jedes Kandidatenkennwort für jeden Benutzer, gegen den es getestet wird, separat gehasht werden.

Superkatze
quelle
2

Einfach gesagt, das Salzen verhindert nicht, dass ein Hash angreift (Bruteforce oder Wörterbuch), sondern macht es nur schwieriger. Der Angreifer muss entweder den Salting-Algorithmus finden (der bei ordnungsgemäßer Implementierung mehr Iterationen verwendet) oder das Algo brutal erzwingen, was, wenn es nicht sehr einfach ist, nahezu unmöglich ist. Durch das Salzen wird auch die Möglichkeit der Suche nach Regenbogentischen fast vollständig verworfen ...

Cyber-Guard
quelle
1

Salt macht Rainbow-Tabellenangriffe viel schwieriger, da es viel schwieriger ist, einen einzelnen Passwort-Hash zu knacken. Stellen Sie sich vor, Sie haben nur ein schreckliches Passwort mit der Nummer 1. Ein Regenbogentischangriff würde dies sofort knacken.

Stellen Sie sich nun vor, jedes Passwort in der Datenbank ist mit einem langen Zufallswert aus vielen zufälligen Zeichen gesalzen. Jetzt wird Ihr mieses Passwort "1" in der Datenbank als Hash von 1 plus einer Reihe von zufälligen Zeichen (das Salz) gespeichert. In diesem Beispiel muss die Regenbogentabelle den Hash für Folgendes haben: 1.

Angenommen, Ihr Salz ist etwas Sicheres und Zufälliges, sagen wir ()% ISLDGHASKLU ( % #% #, die Regenbogentabelle des Hackers müsste einen Eintrag für 1 * ()% ISLDGHASKLU (*% #% # haben. Verwenden Sie jetzt eine Regenbogentabelle Selbst dieses einfache Passwort ist nicht mehr praktikabel.

Cory House
quelle
Siehe Update Nr. 2, Sie hätten einfach rohe Passwörter und würden alle Hashes gegen die Salze für jeden Benutzerdatensatz berechnen.
Tom Gullen
2
Sicher, Tom, ich stimme zu, aber der Punkt ist, dass der Hacker diesen hässlichen, zeitaufwändigen Prozess einmal für jedes Passwort ausführen muss, wenn Salz verwendet wird. Daher erschwert Salz die Verwendung eines Regenbogentisches.
Cory House
3
@ Tom Gullen: Das Erzeugen von gesalzenen Regenbogentabellen ist nur möglich, wenn standortweite Salze verwendet werden. Das Salzen pro Benutzer macht Regenbogentischangriffe so gut wie nutzlos.
Snemarch