Ich werde dies etwas anders betrachten.
Ich speichere immer das Salz, das mit dem gesalzenen Passwort-Hash gemischt ist.
Zum Beispiel werde ich die erste Hälfte des Salzes vor dem gesalzenen Hash des Passworts und die letzte Hälfte des Salzes nach dem gesalzenen Hash des Passworts platzieren. Die Anwendung kennt dieses Design, kann also diese Daten abrufen und den Salt- und Salted-Password-Hash abrufen.
Meine Begründung für diesen Ansatz:
Wenn die Passwort- / Hash-Daten kompromittiert sind und in die Hände eines Angreifers fallen, weiß der Angreifer nicht, was das Salz ist, wenn er sich die Daten ansieht. Auf diese Weise kann ein Angreifer praktisch keinen Brute-Force-Angriff ausführen, um ein Kennwort zu erhalten, das dem Hash entspricht, da er den Hash zunächst nicht kennt und nicht wissen kann, welche Teile der Daten Teile des Salt sind, oder Teile des Salted-Password-Hash (es sei denn, er kennt die Authentifizierungslogik Ihrer Anwendung ).
Wenn der gesalzene Passwort-Hash unverändert gespeichert wird, kann ein Brute-Force-Angriff ausgeführt werden, um ein Passwort zu erhalten, das beim Saltieren und Hashing dieselben Daten wie der gesalzene Passwort-Hash erzeugt.
Selbst wenn beispielsweise der gesalzene Passwort-Hash unverändert gespeichert, aber mit einem einzelnen zufälligen Byte vorangestellt wird, würde dies ebenfalls die Schwierigkeit erhöhen, solange der Angreifer nicht weiß, dass dieses erste Byte verworfen werden soll des Angriffs. Ihre Anwendung kann das erste Byte der Daten verwerfen, wenn sie zur Authentifizierung Ihres Benutzers verwendet wird.
Der Abschluss dazu ..
1) Speichern Sie niemals die Daten, die Ihre Authentifizierungsanwendung verwendet, in exakter Form.
2) Wenn möglich, halten Sie Ihre Authentifizierungslogik für zusätzliche Sicherheit geheim.
Gehen Sie noch einen Schritt weiter.
Wenn Sie die Authentifizierungslogik Ihrer Anwendung nicht geheim halten können, wissen viele Leute, wie Ihre Daten in der Datenbank gespeichert sind. Angenommen, Sie haben beschlossen, den gesalzenen Passwort-Hash zusammen mit dem Salz zu mischen, wobei ein Teil des Salzes dem gesalzenen Passwort-Hash vorangestellt ist und der Rest des Salzes ihn anhängt.
Bei der Generierung des zufälligen Salzes können Sie auch zufällig entscheiden, welchen Anteil Ihres Salzes Sie vor / nach dem gesalzenen Passwort-Hash speichern.
Beispielsweise generieren Sie ein zufälliges Salz von 512 Bytes. Sie hängen das Salt an Ihr Passwort an und erhalten den SHA-512-Hash Ihres Salted-Passworts. Sie generieren auch eine zufällige Ganzzahl 200. Anschließend speichern Sie die ersten 200 Bytes des Salzes, gefolgt vom gesalzenen Passwort-Hash, gefolgt vom Rest des Salzes.
Bei der Authentifizierung der Kennworteingabe eines Benutzers geht Ihre Anwendung über die Zeichenfolge und geht davon aus, dass das erste 1-Byte der Daten das erste 1-Byte des Salt ist, gefolgt vom Salted-Hash. Dieser Pass wird fehlschlagen. Die Anwendung wird fortgesetzt, indem die ersten 2 Bytes der Daten als die ersten 2 Bytes des Salzes verwendet werden, und wiederholt, bis ein positives Ergebnis gefunden wird, nachdem die ersten 200 Bytes als die ersten 200 Bytes des Salzes verwendet wurden. Wenn das Kennwort falsch ist, versucht die Anwendung weiterhin alle Permutationen, bis keine gefunden werden.
Die Vorteile dieses Ansatzes:
Erhöhte Sicherheit - selbst wenn Ihre Authentifizierungslogik bekannt ist, ist die genaue Logik zur Kompilierungszeit unbekannt. Es ist praktisch unmöglich, einen Brute-Force-Angriff durchzuführen, selbst wenn die genaue Logik bekannt ist. Erhöhte Salzlängen erhöhen die Sicherheit weiter.
Die Nachteile dieses Ansatzes:
Da die genaue Logik zur Laufzeit abgeleitet wird, ist dieser Ansatz sehr CPU-intensiv. Je länger das Salz ist, desto CPU-intensiver wird dieser Ansatz.
Die Authentifizierung falscher Passwörter ist mit den höchsten CPU-Kosten verbunden. Dies kann für legitime Anfragen kontraproduktiv sein, erhöht jedoch die Sicherheit gegen Angreifer.
Dieser Ansatz kann auf verschiedene Arten implementiert und durch Verwendung von Salzen mit variabler Breite und / oder gesalzenen Passwort-Hashes noch sicherer gemacht werden.