In einem Linux-System werden Kennwörter mit einem MD5-Hash gespeichert. Warum kann die Verwendung von "Salz" das System mehr schützen? Insbesondere möchte ich die folgenden zwei klarstellen.
/etc/shadow
. Zum Beispiel hat Benutzer A den Benutzer salt s1 und generiert h1; %Code%.
Das nächste Mal verwendet es Salz s2 und das System muss einen anderen Hash generieren, h1 = md5(password.s1);
. Da h1 nicht gleich h2 ist, wie kann das System den Benutzer authentifizieren?
MD5 ist ein Hash, wie Sie wissen, wenn Sie also eine Eingabe wie "PASSWORD" eingeben, erhalten Sie eine eindeutige (hoffentlich - aber MD5 hat Kollisionen in diesen Tagen) Ausgabe, wie "3DE2AF ...".
Nun, wie Sie wissen, ist es ziemlich schwer, das direkt umzukehren, bis jemand dachte ... warten Sie, warum ich nicht alle möglichen Kombinationen von Hashwerten vorgeneriere, bis ich den Hashwert umkehren kann. Dies nennt man eine Regenbogen-Tabelle .
Der Zweck eines Salzes besteht darin, willkürliche Zufallsdaten zu der zu haschenden Zeichenkette hinzuzufügen, so dass Sie die Länge der Eingabe auf Hash erhöhen. Dies bedeutet, dass allgemeine Rainbow-Tabellen, die nur eine Passworteingabe in einen Hashwert umkehren, nicht funktionieren. Da es sich bei Rainbow-Tabellen natürlich nur um Reverse-Lookups handelt, könnten Sie einfach eine Rainbow-Tabelle erzeugen, um alle möglichen Password + Salt-Ausgaben zu kompensieren. Hier kommt die Längenzunahme zum Tragen; Aufgrund der Art der Umkehrung von Hashwerten wird der Speicherplatz für Umkehrungen für sehr lange Hash-Eingaben bald undurchführbar. Alphanumerische Rainbow-Tabellen für 6-8 Zeichen sind bereits ein paar Gigabyte; Erhöhen Sie die Länge und die Zeichenklassen, und Sie beginnen, in Vielfachen von 10 GB zu sprechen.
Natürlich, wenn du mit 'PASSWORD' salzt und 'PASSWORD' hashst, dann hast du 'PASSWORDPASSWORD', was nicht viel sicherer ist, also ist auch die Wahl des Salzes wichtig. Im Idealfall sollten Sie mit jeder Hash-Zeichenfolge ein zufälliges Salz verwenden, aber natürlich müssen Sie wissen, was es ist. Eine übliche Technik besteht darin, ein Salz aus dem Benutzernamen oder einer anderen Eigenschaft, die für diesen Fall einzigartig ist, abzuleiten. Das Hinzufügen beliebiger Daten ist an sich nicht sinnvoll; Die benutzerbestimmten Saltdaten fügen nun einen zusätzlichen Grad an Komplexität hinzu, so dass Rainbow-Tabellen mit spezialisierten Suchen für jeden Benutzer benötigt werden. Je mehr Sie dies schwierig machen, desto mehr Rechenleistung wird benötigt. Da ist der Kampf.
Allerdings gibt es einige moderne Techniken. Ich bin kein Experte, also kann ich Ihnen nicht sagen, wie sicher diese sind, aber sie sind erwähnenswert. Das Konzept ist langsames Hashing. Im Grunde nehmen Sie durch zusammengesetzte Hash-Funktionen eine Weile Zeit, um jeden Hash zu berechnen. Daher hat die Fähigkeit jedes Benutzers, das Passwort zu überprüfen, jetzt eine konstante Zeit für jedes Passwort, das Sie überprüfen möchten. Wenn Sie Brute-Force sind, ist das Bad News (tm). Wenn das System gut entworfen ist und keine Abkürzungen vorhanden sind (was wahrscheinlich mit Schwächen gleichgesetzt wird), sollte das Generieren einer Rainbow-Tabelle für eine langsame Hash-Funktion ebenfalls eine Weile dauern.
Bearbeiten hier mehr Details. Für das erste Beispiel siehe crypt()
. @CodeInChaos hat PBKDF2
Wie ich schon sagte, ich bin kein Experte für Kryptoanalyse. Bei letzterem habe ich kein besonderes Fachwissen, ich zeige Ihnen nur, wohin die Dinge gehen.
Edit 2 Ich habe meine Salzaufzeichnung geklärt - ich glaube, ich habe schon vorher mit dem Schlüsselproblem des Speicherplatzes getanzt.
Sie können einen einfachen Hashalgorithmus mit roher Gewalt umkehren.
Wenn Sie ein allgemeines Wort für Passwörter verwenden, können einige vorgefertigte Tabellen (wie Regenbogenfarben ) diese enthalten. Aus diesem Grund rufen die meisten Algorithmen die Hash-Funktion mehrmals auf:
%Vor%Die Verwendung von "salt" gibt dem generierten Passwort viel mehr Zufälligkeit und macht es somit weniger erratbar. Es besteht aus dem Hinzufügen einer zufälligen Zeichenfolge im Prozess
%Vor%Ein Grund könnte sein, dass wenn zwei Leute das gleiche Passwort unwissentlich benutzen, sie dasselbe MD5 erzeugen. Einer von ihnen sieht einfach / etc / shadow und rate anderen Jungs Passwort.
Jetzt, da zu jedem Passwort ein Salz hinzugefügt wird, erzeugen sogar dieselben Passwörter unterschiedliche Hashes.
Wenn Sie Daten verschlüsseln, kann es immer noch von bruce-force-Angriffen und Regenbogenattacken . Beim Aussalzen fügen Sie am Ende der verschlüsselten Daten einige zusätzliche Bits hinzu. So kann der Angreifer die Originaldaten nicht richtig erhalten.