Ihr Passwort salzen: Best Practices?

162

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. :) :)

Randolpho
quelle
1
@Jaccco: tolle Eingabe. Vielen Dank!
Randolpho
3
Die beste Vorgehensweise besteht darin, eine kryptografische Funktion zu verwenden, die das Salzen für Sie übernimmt und entweder PBKDF2 (Standard), bcrypt oder sogar scrypt verwendet. Vielen Dank an Stephen für den Hinweis.
Maarten Bodewes
1
Nahezu alle Standardkonstruktionen für das Hashing von Passwörtern kümmern sich um die Kombination von Salt und Passwort. Sie sollten sich also keine Sorgen machen. Wenn Sie keinen Standardkennwort-Hash verwenden, migrieren Sie zu einem.
CodesInChaos
1
@ Omu Schlechte Empfehlung. 1) Eine einzelne Iteration von SHA-1 ist zu schnell, Sie sollten mindestens 10000 verwenden, und selbst das ist ziemlich schwach. 2) Das Standardsalz ist zu klein. 8 Bytes sind mindestens und 16 werden empfohlen.
CodesInChaos

Antworten:

111

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:

  1. Das Salz muss für jedes Passwort, das Sie speichern, unterschiedlich sein. (Dies ist ein weit verbreitetes Missverständnis.)
  2. Verwenden Sie einen kryptografisch sicheren Zufallszahlengenerator.
  3. Wähle ein ausreichend langes Salz. Denken Sie an das Geburtstagsproblem.

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.

Georg Schölly
quelle
4
Ich habe einen Link zu einer alten Frage hinzugefügt und diese Antworten gelesen. Wenn Sie kein anderes zufälliges Salt pro Passwort verwenden, gehen Sie ein unnötiges Sicherheitsrisiko ein. Dies könnte in Zukunft ein echtes Problem sein.
Georg Schölly
39
Site-weites zufälliges Salz ist schlecht, da ein Angreifer Regenbogentabellen vorberechnen und Ihre gesamte Benutzerdatenbank abrufen kann. Wenn Sie dies nicht verstehen, schreiben Sie bitte keine Login- / Sicherheitssysteme :) - Sie BRAUCHEN Salze pro Benutzer.
Snemarch
3
Ja, Salz pro Benutzer. Idealerweise mit gespeicherten Iterationen pro Benutzer (sodass Sie die Anzahl der im Laufe der Zeit verwendeten Iterationen erhöhen können). In jedem anständigen Framework ist dies integriert. (.NET hat PasswordDeriveBytes, die alles für Sie erledigen.)
MichaelGG
2
Wenn Sie ein Sicherheitssystem entwerfen, wird kein Salz pro Benutzer verwendet. Ihre Site ist vielleicht nicht besonders interessant, aber
denken Sie
2
Natürlich schützen Salze vor Wörterbuchangriffen, gerade indem sie viel langsamer werden. Die Verwendung von Salzen in Passwörtern geht Regenbogen-Tabellen weit voraus. Salze wurden speziell hinzugefügt, um Wörterbuchangriffe zu verlangsamen, indem verhindert wurde, dass Angreifer ein Kennwort einmal hashen und es dann mit allen Benutzern vergleichen.
Glenn Maynard
27

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: © ¤¡

Tom Ritter
quelle
@onebyone, verdammt! Er hat mein Salz von 'Passwordsalt' entdeckt!
Samuel
6
@ Samuel: Ich weiß nichts über euch, aber wir verwenden '12345' für unser Salz. :)
Randolpho
@onebyone gültig. Ich meinte wirklich "gewöhnlich" als "alle Salze unter der Länge X im Zeichensatz Y", wobei X, Y vernünftig sind; sagen wir 20 Zeichen und alphanumerische Groß- / Kleinbuchstaben. Erweiterbar, um alle hexadezimalen Zeichenfolgen unter der Länge Z (z. B. 160) zu sagen, da ich denke, dass eine Regenbogentabelle mit Hash-Hashes nützlich wäre.
Tom Ritter
1
@ Randolpho: Hey, das ist auch mein Salz! Was sind die Chancen?
Adrien
Und stellen Sie sicher, dass das Salz nicht vorhersehbar ist / Zufällig: stackoverflow.com/questions/1645161/…
Jacco
18

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 falseob sich ein Zeichen unterscheidet. Jetzt können Angreifer statistische Methoden verwenden, um herauszufinden, was der Hash ist, ein Charakter zu einem Zeitpunkt.

Stephen Touset
quelle
1
Zum letzten Absatz: Wie kann der Angreifer Informationen über die genaue Anzahl der Zeichen erhalten, bei denen der Vergleich fehlgeschlagen ist? Das macht keinen Sinn ..
Halloween
1
Sie sind sowohl richtig als auch falsch. Timing-Angriffe sind real und haben sich wiederholt als erschreckend genau erwiesen, selbst über Netzwerkverbindungen mit variabler Latenz, um genau zu bestimmen, wo der Vergleich fehlgeschlagen ist. Timing-Angriffe sind jedoch nicht auf gängige Passwort-Hashes anwendbar, da es rechnerisch nicht möglich ist, Eingaben zu finden, die nur kleine Teile der Ausgabe ändern.
Stephen Touset
9

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.

Phil H.
quelle
1
Hash-Kollisionen hängen von der Größe des Hash ab. Dank des Geburtstagsproblems sind Kollisionen sehr wahrscheinlich.
Georg Schölly
2
Nur wenn Sie das Ergebnis abschneiden. Wie auch immer, ich stehe immer noch zu dem Punkt, dass es keinen Unterschied macht, wo sich das Salz befindet, weil der Punkt des Hash darin besteht, dass die Beziehung zwischen Eingabe und Ausgabe keine Muster enthält.
Phil H
7

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 .

Snemarch
quelle
2
Falsche Antwort: Ein Angreifer könnte MD (Pass) für viele häufig verwendete Passwörter vorberechnen und dann MD (Pass + Salt) sehr billig berechnen, da Message Digest inkrementell funktioniert, um das Streaming zu unterstützen.
Erwan Legrand
5

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:

Der Angreifer verfügt über 'Regenbogentabellen', die nicht aus den Hashes von Wörterbuchwörtern bestehen, sondern aus dem Status der Hash-Berechnung unmittelbar vor Abschluss der Hash-Berechnung.

Es könnte dann billiger sein, einen Kennwortdateieintrag mit Postfix Salt brutal zu erzwingen als Präfix Salt: Für jedes Wörterbuchwort würden Sie wiederum den Status laden, die Salt-Bytes in den Hash einfügen und ihn dann finalisieren. Mit vorangestelltem Salz hätten die Berechnungen für jedes Wörterbuchwort nichts gemeinsam.

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.

Cygil
quelle
Sie sollten die Beschreibung der Runden überprüfen. Die Runden werden pro Block durchgeführt, nicht die gesamte Nachricht. (Andernfalls müsste beim Hashing von Streaming-Daten immer wieder zurückgespult werden.) Die Verwendung von Iterationen verhindert jedoch das Problem, das von jedem erwähnt wird.
MichaelGG
4

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.

Samuel
quelle
3
Soweit ich weiß, muss BCrypt Hash wie jedes andere Hashing-Schema gesalzen werden.
Jacco
2

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.

jeffcook2150
quelle