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.