Ich habe ein wenig recherchiert oder gegoogelt, um verschiedene Methoden für das Password-Hashing und -Salzen zu finden und bin auf diesen interessanten Link gestoßen:
Im Wesentlichen schlägt das nun vor, zwei Benutzerfunktionen zu erstellen, eine für Hashing und eine für die Überprüfung des Hash.
Das Salz ist pseudozufällig, basiert aber tatsächlich auf dem Passwort (erscheint mir als schlecht?).
Die Hash-Funktion pusht auch zufällig das Salz zwischen den Hash-Strings.
Die Hash-Funktion kehrt die Salzberegnung um und die eigentliche Hash-Prüfung findet statt.
Nun, ich bin mir bewusst, dass einzigartige Salze für jedes Passwort Hash = gut, aber auch, dass die Logik, die Passwörter zu hash und die Salz in einer db-Funktion gespeichert möglicherweise = schlecht.
Ich mag die Idee, dass das Salz nicht offensichtlich ist und dass es auch nicht auf einem hoffentlich konsistenten Wert wie Benutzername, Benutzer-ID, Geburtsdatum usw. basieren muss, aber wie gesagt habe ich meine Zweifel die Implementierung.
Was sind also die Meinungen und Ideen der Menschen von "Best-Approach-Lösungen"?
Der Zweck eines Salzes ist es, den Einsatz einer Regenbogen-Tabelle unerschwinglich teuer zu machen, so dass sich Versuch 1 ziemlich gut löst das Problem richtig. Wenn man das Salz auf das Passwort setzt, wird die Variabilität beseitigt, die Rainbow-Tabellen besiegt, und es ist einfach sinnlos, es im Hash-Passwortfeld zu verstecken.
Das Salz muss nicht sei geheim. Es muss für ein gegebenes Passwort unvorhersehbar sein.
Das Ableiten des Salzes aus dem Passwort verfehlt den Punkt vollständig.
Ich habe eine ähnliche Frage früher gestellt. Der Konsens war folgender:
Es ist egal, wie du salzt, solange du:
Sie können sogar Ihr Salz direkt neben Ihren Hash-Passwörtern lagern und sich ziemlich selbstsicher fühlen.
Ich persönlich finde, GUIDs (im String-Format) funktionieren hervorragend für Salze. Sie nehmen eine Codezeile zum Generieren und sind im String-Format mehr als groß genug, um Rainbow-Tabellen dazu zu bringen, Jahrtausende zu berechnen.
Es wurden schon viele ähnliche Fragen gestellt:
Das sollte Ihnen eine Idee davon geben, wie man Passwörter hasht.
(Bearbeitete Antwort, weil ich den Artikel anfangs falsch gelesen habe und dachte, er mischte nur das Salz mit einem ungesalzenen Hash)
Seine Techniken scheinen in Ordnung zu sein, sie werden funktionieren, aber sie sind nicht wirklich "besser" als normale Salzmethoden. Es ist nur ein Versuch, Sicherheit durch Dunkelheit zu schaffen, es ist nicht besser, als eine zufällige "Hash-Scrambling" -Methode zu entwickeln und zu hoffen, dass der Angreifer es nicht versteht.
Tatsächlich könnte es für den Angreifer in der Tat sehr einfach sein, diese Funktionen in vielen Fällen herauszufinden. Wenn es sich bei der Site um eine öffentliche Registrierung handelt, kann der Angreifer wiederholt Konten mit bekannten Kennwörtern registrieren und anschließend die bekannten md5-Hashwerte für diese Kennwörter verwenden, um den Algorithmus zur Kennwortverschlüsselung zurückzuentwickeln. Ich könnte das sehr leicht machen und sogar das Ergebnis von "Versuch 4" betrachten.
Wenn Sie Ihre Passwörter wirklich sicher speichern möchten, verlassen Sie MD5 und sogar SHA1 und bewegen Sie sich zu einer gesalzenen, langsameren Hash-Funktion. Dies ist ein großartiger Artikel über das Thema: Genug mit den Rainbow Tables: Was Sie über sichere Passwort-Schemata wissen müssen
Interessanterweise ist dies nicht nur Verschleierung, nicht mehr Sicherheit , sondern Verschleierung, weniger Sicherheit , weil "Versuch 4" nur so gut ist wie die CRC32-Funktion (CRC32 ist nur das Passwort, nicht Passwort + Salz übergeben) - das ist der Untergang.
Wie in Chads Post, um "Versuch 4" zu knacken, muss man nur CRC32 Lasten von Passwörtern machen und dann die Funktion, die er codiert hat, umkehren, mit einem gesalzenen md5 Hash und dem Salz (was man dann testen würde) für die Gültigkeit). Testen Sie dieses Paar einfach, indem Sie md5 (password + salt) berechnen (wobei password das Passwort ist, das Sie versuchen) und salt ist das Salz, das Sie durch Umkehrung des Algorithmus berechnet haben. Wenn das MD5 gleich den ersten 32 Zeichen des Hashes ist, haben Sie das Passwort geknackt.
"Versuch 4" ist in einigen Punkten schlechter als "Versuch 1", da es nur so gut ist wie die schlechteste Funktion, die in der gesamten Routine aufgerufen wird, in diesem Fall CRC32 (Passwort).
Ich kann den Link in der ursprünglichen Frage nicht anzeigen (die Website gibt nur einen Fehler 404 nicht gefunden zurück), aber die in der Frage beschriebene Methode verwendet nicht wirklich einen gesalzenen Hash.
Im Wesentlichen verwendet diese Methode nur einen Nicht-Standard-Hash: Bei einem bestimmten Passwort gibt es einen eindeutigen Wert, der in der Datenbank gespeichert wird. Dies ist alles, was benötigt wird, um einen Rainbow Tables-Angriff zu ermöglichen: Ich kann den Hash-Wert für ein Wörterbuch wahrscheinlicher Passwörter vorberechnen und nach Übereinstimmungen suchen. Jetzt muss ich Rainbow-Tabellen speziell für diese nicht standardmäßige Hash-Funktion vorberechnen.
Bei einer korrekten Implementierung von gesalzenen Hashes wird beim Erstellen des Passord ein zufälliges Salz mit dem Passwort kombiniert und gehashed. Dann wird zufälliges Salz verwendet und der Hash gespeichert. Selbst wenn ich das Passwort kenne, kann ich nicht vorhersagen, was der Hash sein wird, da es für jeden der vielen möglichen Salt-Werte einen anderen Hash geben wird. Nun muss ein Angreifer eine Rainbow-Tabelle für jeden möglichen Salzwert vorberechnen: Dies erfordert einen viel größeren Aufwand.
Tags und Links mysql passwords encryption hash salt