Ich war schon immer neugierig ... Was ist besser, wenn man ein Passwort für das Hashing salzt: Präfix oder Postfix? Warum? Oder spielt es eine Rolle, solange Sie salzen?
Zur Erklärung: Wir alle wissen (hoffentlich) inzwischen, dass wir ein Passwort salzen sollten, bevor wir es für die Speicherung in der Datenbank hashen [ Bearbeiten: So können Sie Dinge wie das vermeiden, was Jeff Atwood kürzlich passiert ist ]. In der Regel erfolgt dies durch Verketten des Salt mit dem Kennwort, bevor es durch den Hashing-Algorithmus geleitet wird. Aber die Beispiele variieren ... Einige Beispiele stellen das Salz vor das Passwort. Einige Beispiele fügen das Salz nach dem Passwort hinzu. Ich habe sogar einige gesehen, die versuchen, das Salz in die Mitte zu stellen.
Welches ist die bessere Methode und warum? Gibt es eine Methode, die die Wahrscheinlichkeit einer Hash-Kollision verringert? Mein Googeln hat keine anständige Analyse zu diesem Thema ergeben.
Edit: Tolle Antworten Leute! Es tut mir leid, dass ich nur eine Antwort auswählen konnte. :) :)
quelle
Antworten:
Präfix oder Suffix sind irrelevant, es geht nur darum, dem Passwort etwas Entropie und Länge hinzuzufügen.
Sie sollten diese drei Dinge berücksichtigen:
Dave Sherohman gibt eine hervorragende Antwort auf eine andere Frage, warum Sie zufällig erzeugte Salze anstelle des Namens eines Benutzers (oder anderer persönlicher Daten) verwenden sollten. Wenn Sie diesen Vorschlägen folgen, spielt es keine Rolle, wo Sie Ihr Salz einfüllen.
quelle
Ich denke, es ist alles Semantik. Es spielt keine Rolle, es vorher oder nachher zu setzen, außer gegen ein ganz bestimmtes Bedrohungsmodell.
Die Tatsache, dass es dort ist, soll Regenbogentische besiegen.
Das Bedrohungsmodell erwähnte ich das Szenario wäre, wenn der Gegner kann Rainbow - Tabellen von gemeinsamen Salzen hängten / vorangestellt , um das Passwort hat. (Sagen Sie die NSA) Sie vermuten, sie haben es entweder angehängt oder vorangestellt, aber nicht beide. Das ist albern und eine schlechte Vermutung.
Es ist besser anzunehmen, dass sie die Kapazität haben, diese Regenbogentabellen zu speichern, aber nicht beispielsweise Tische mit seltsamen Salzen, die in der Mitte des Passworts verteilt sind. In diesem engen Fall würde ich vermuten, dass eingestreut am besten wäre.
Wie ich sagte. Es ist Semantik. Wählen Sie ein anderes Salz pro Passwort, ein langes Salz, und fügen Sie ungerade Zeichen wie Symbole und ASCII-Codes hinzu: © ¤¡
quelle
Die wirkliche Antwort, die niemand berührt zu haben scheint, ist, dass beide falsch sind . Wenn Sie Ihre eigene Krypto implementieren, egal wie trivial ein Teil denken Sie Sie tun, Sie werden Fehler machen.
HMAC ist ein besserer Ansatz, aber selbst dann, wenn Sie so etwas wie SHA-1 verwenden, haben Sie bereits einen Algorithmus ausgewählt, der aufgrund seines Geschwindigkeitsdesigns nicht für das Hashing von Passwörtern geeignet ist. Verwenden Sie etwas wie bcrypt oder möglicherweise scrypt und nehmen Sie das Problem vollständig aus Ihren Händen.
Oh, und denken Sie nicht einmal daran, die resultierenden Hashes auf Gleichheit mit Ihrer Programmiersprache oder Ihren Dienstprogrammen zum Vergleichen von Datenbankzeichenfolgen zu vergleichen. Diese vergleichen Zeichen für Zeichen und schließen kurz, als
false
ob sich ein Zeichen unterscheidet. Jetzt können Angreifer statistische Methoden verwenden, um herauszufinden, was der Hash ist, ein Charakter zu einem Zeitpunkt.quelle
Es sollte keinen Unterschied machen. Der Hash ist nicht mehr leicht zu erraten, wo immer Sie das Salz setzen. Hash-Kollisionen sind sowohl selten als auch unvorhersehbar, da sie absichtlich nicht linear sind. Wenn es einen Unterschied für die Sicherheit machen würde, würde dies auf ein Problem mit dem Hashing hinweisen, nicht mit dem Salzen.
quelle
Wenn Sie einen kryptografisch sicheren Hash verwenden, sollte es keine Rolle spielen, ob Sie vor oder nach dem Fixing arbeiten. Ein Hashing-Punkt ist, dass eine einzelne Bitänderung in den Quelldaten (egal wo) einen anderen Hash erzeugen sollte.
Was ist wichtig, wenn verwendet, lange Salz, sie mit einem richtigen Verschlüsselungs PRNG zu erzeugen, und mit pro-Benutzer - Salzen. Das Speichern der Salze pro Benutzer in Ihrer Datenbank ist kein Sicherheitsproblem, da ein standortweiter Hash verwendet wird .
quelle
Zunächst wird der Begriff "Regenbogentisch" konsequent missbraucht. Ein "Regenbogentisch" ist nur eine besondere Art von Nachschlagetabelle, die eine bestimmte Art der Datenkomprimierung auf den Schlüsseln ermöglicht. Durch den Austausch von Berechnungen gegen Speicherplatz kann eine Nachschlagetabelle, die 1000 TB benötigt, tausendmal komprimiert werden, sodass sie auf einem kleineren Laufwerk gespeichert werden kann.
Sie sollten sich Sorgen über Hash-to-Passwort-Nachschlagetabellen, Regenbogen oder andere Dinge machen.
@ onebyone.livejournal.com:
Für eine einfache Hash-Funktion, die linear durch die Eingabezeichenfolge scannt, z. B. einen einfachen linearen Kongruenzgenerator, ist dies ein praktischer Angriff. Eine kryptografisch sichere Hash-Funktion ist jedoch absichtlich so konzipiert, dass sie mehrere Runden enthält, von denen jede alle Bits der Eingabezeichenfolge verwendet, sodass die Berechnung des internen Zustands unmittelbar vor der Zugabe des Salzes nach der ersten Runde nicht sinnvoll ist. Zum Beispiel hat SHA-1 80 Runden.
Darüber hinaus setzen Passwort-Hashing-Algorithmen wie PBKDF ihre Hash-Funktion mehrmals zusammen (es wird empfohlen, PBKDF-2 mindestens 1000 Mal zu wiederholen, wobei jede Iteration zweimal SHA-1 anwendet), was diesen Angriff doppelt unpraktisch macht.
quelle
BCrypt-Hash, wenn die Plattform einen Anbieter hat. Ich finde es toll, dass du dir keine Sorgen um die Herstellung der Salze machst und sie noch stärker machen kannst, wenn du willst.
quelle
Das Einfügen einer beliebigen Anzahl von Zeichen in das Kennwort ist der am wenigsten erwartete und daher sozial "sicherste" Fall, im allgemeinen Fall jedoch nicht sehr wichtig, solange Sie ein langes, eindeutiges Kennwort verwenden Saiten für Salze.
quelle