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.
quelle
Antworten:
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.
quelle
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.
quelle
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
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):
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
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 nur
27662aee8eee1cb5ab4917b09bdba31d091ab732
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.
quelle
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).
quelle
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.
quelle
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 ...
quelle
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.
quelle