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

Update: Bitte beachten Sie, ich bin nicht zu Fragen, was ein Salz ist, was eine rainbow-Tabelle ist, was ein Wörterbuch-Angriff ist, oder was der Zweck der ein Salz ist. Ich bin der Abfrage: Wenn Ihnen der Benutzer salt und hash, ist es nicht ganz einfach zu berechnen sein Passwort?

Verstehe ich den Prozess, und implementieren Sie mich in einige meiner Projekte.

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

In der Datenbank speichern:

username | hashed_password | salt

Jeder Implementierung von Salzen, die ich gesehen habe, fügt das Salz entweder am Ende des Passwortes oder Beginn:

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

Darum, ein Wörterbuch-Angriff von einem hacker, der etwas taugt (ha ha) würde dazu führen, dass jedes keyword anhand der gespeicherten Salze, die in der gemeinsamen Kombinationen, die oben aufgeführt sind.

Sicherlich die Umsetzung, die oben beschrieben fügt einfach ein weiterer Schritt für die hacker, ohne tatsächlich die Lösung des zugrunde liegenden Problems? Welche alternativen gibt es zu Schritt, um dieses Problem, oder bin ich Missverständnis das problem?

Das einzige was ich mir vorstellen kann zu tun haben, ist ein Geheimnis-blending-Algorithmus, der die Schnürsenkel, das Salz und das Passwort zusammen in einem zufälligen Muster an, oder fügt weitere benutzerdefinierte Felder, um die hashing-Prozess, d.h. die hacker haben Zugang zu den Datenbank-UND code-zu-Spitzen Sie für ein Wörterbuch-Angriff, um sich als fruchtbar erweisen. (Update, wie bereits in den Kommentaren ist es am besten annehmen, dass die hacker Zugriff auf alle Ihre Informationen, so dass dies wahrscheinlich nicht am besten).

Lassen Sie mich ein Beispiel geben, wie ich schlage vor, ein hacker würde hack eine Benutzer-Datenbank mit einer Liste von Passwörtern und hashes:

Daten aus unserer Datenbank gehackt:

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

Gemeinsame Passwort Wörterbuch:

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

Für jeden Benutzer Aufnahme, loop-die gemeinsame Passwörter und hash 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.

Gegeben 10,000 häufigsten Passwörter, und 10.000 Benutzer-Datensätze, die wir brauchen würden, zu berechnen 100,000,000 hashes zu entdecken, wie viele user Passwörter wie möglich. Es könnte ein paar Stunden dauern, aber es ist nicht wirklich ein Problem.

Update auf Risse Theorie

Nehmen wir an wir sind eine korrupte webhost, hat Zugriff auf eine Datenbank von SHA1-hashes und Salze, die zusammen mit Ihrem Algorithmus zu verschmelzen. Die Datenbank hat 10.000 Benutzer Datensätze.

Diese Website Ansprüche berechnen zu können 2,300,000,000 SHA1-hashes pro Sekunde, die mithilfe der GPU. (In der realen-Welt-situation wird wahrscheinlich langsamer sein, aber für jetzt verwenden wir, dass die zitierte Abbildung).

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

Gegeben, eine vollständige Palette von 95 druckbaren ASCII-Zeichen mit einer maximalen Länge von 4 Zeichen, geteilt durch die rate der Berechnung (variable) geteilt durch 2 (vorausgesetzt, die Durchschnittliche Zeit, zu entdecken, Passwort wird im Durchschnitt benötigen 50% der Permutationen), für 10.000 Nutzer, die es dauern würde, 177 Sekunden, um alle Benutzer-Passwörter, wo die Länge ist <= 4.

Let ' s einstellen, ein bisschen Realismus.

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

Vorausgesetzt, nicht die groß-und Kleinschreibung, mit einem Passwort der Länge <= 7, nur alphanumerische Zeichen, es dauerte 4 Tage zu lösen, für 10.000 Benutzer Datensätze, und ich habe Sie halbiert die Geschwindigkeit des Algorithmus zu reflektieren, overhead-und nicht idealen Umständen.

Ist es wichtig zu erkennen, dass dies eine lineare brute-force-Angriff, alle Berechnungen sind unabhängig voneinander, daher ist es eine perfekte Aufgabe für mehrere Systeme zu lösen. (ALSO einfach bis zu 2 Computer unter Angriff von verschiedenen enden, die würden die Hälfte der exectution Zeit).

In dem Fall rekursiv Hash ein Passwort 1.000 mal um diese Aufgabe rechnerisch teuer:

(((36^7) /1 000 000 000) /2) * 1000
Sekunden = 10.8839117 Stunden

Dies entspricht einer maximalen Länge von 7 alpha-numerische Zeichen, auf weniger als die Hälfte die Geschwindigkeit der Ausführung von zitierte Bild für ein Benutzer.

Rekursiv hashing-1000 mal blockiert effektiv eine Decke Angriff, sondern gezielte Angriffe auf Anwender-Daten sind immer noch anfällig.

InformationsquelleAutor der Frage Tom Gullen | 2010-08-25

Schreibe einen Kommentar