Ich habe mir gerade die Implementierung des Passwort-Hashings in Django angesehen und festgestellt dass es das Salz vorangestellt wird so dass der Hash wie folgt erstellt wird sha1(salt + password)
zum Beispiel.
Meiner Meinung nach sind Salze für zwei Zwecke gut
-
Verhinderung von Regenbogentabellen-Lookups
Nun gut, das Voranstellen/Anhängen des Salzes macht bei Regenbogentabellen nicht wirklich einen Unterschied.
-
Härtung gegen Brute-Force-/Wörterbuch-Angriffe
Darum geht es in meiner Frage. Wenn jemand ein einzelnes Kennwort aus einer gestohlenen Kennwortdatenbank angreifen will, muss er eine Vielzahl von Kennwörtern ausprobieren (z. B. Wörterbuchwörter oder [A-Za-z0-9]-Permutationen).
Nehmen wir an, mein Passwort ist "abcdef", das Salt ist "salt" und der Angreifer probiert alle [a-z]{6} Passwörter aus.
Mit einem Vorsalz muss man berechnen
hash("salt")
den Zustand des Hash-Algorithmus speichern und dann von diesem Punkt aus für jede Permutation fortfahren. Das heißt, um alle Permutationen zu durchlaufen, sind 26^6 Kopier-Hash-Algorithmus-Status-Struktur-Operationen und 26^6hash(permutation of [a-z]{6})
Operationen. Da das Kopieren des Zustands des Hash-Algorithmus verdammt schnell ist, trägt das Salz hier kaum zur Komplexität bei, egal wie lang es ist.Aber mit einem angehängten Salz muss der Angreifer berechnen
hash(permutation of [a-z]{6} + salt)
für jede Permutation, was zu 26^10 Hash-Operationen führt. Also offensichtlich, anhängend Salze je nach Länge des Salzes eine zusätzliche Komplexität.
Ich glaube nicht, dass dies historische Gründe hat, denn Django ist ziemlich neu. Was ist also der Sinn von vorangestellt Salze?