Wo lagern Sie Ihre Salzstränge?
Benutzte ich immer eine richtige pro-Eintrag salt-string, wenn das hashing der Passwörter für Datenbank-storage. Für meine Bedürfnisse, speichern das Salz in der DB neben dem Hash-Passwort hat immer gut geklappt hat.
Allerdings empfehlen einige Leute, dass das Salz werden getrennt von der Datenbank gespeichert. Ihr argument ist, dass, wenn die Datenbank kompromittiert, kann ein Angreifer immer noch bauen eine rainbow-table die eine bestimmte salt-string zu berücksichtigen, um zu knacken, ein Konto bei einer Zeit. Wenn das Konto hat admin-Rechte, dann kann er auch kein crack jede andere.
Aus Sicht der Sicherheit ist es Wert, es zu speichern Salze in einem anderen Ort? Betrachten Sie eine web-Anwendung mit dem server-code und die DB auf der gleichen Maschine. Wenn die Salze sind in einer flachen Datei gespeichert auf dem Computer, die Chancen sind, dass, wenn die Datenbank kompromittiert ist, können die Salze Datei wird auch.
Gibt es irgendwelche empfohlenen Lösungen dazu?
InformationsquelleAutor der Frage friedo | 2009-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Punkt von rainbow-Tabellen ist, dass Sie im Voraus erstellt und verteilt en masse zu sparen Rechenzeit für andere - es dauert genauso lange zum generieren von rainbow-Tabellen on-the-fly, wie es wäre zu einfach zu knacken das Passwort+salt-Kombination direkt (da effektiv was gemacht wird, beim erzeugen von rainbow tables ist bereits ausgeführt, dass die Berechnungen für brute-forcen der hash), so das argument, dass durch das wissen, das Salz könnte jemand "erstellen einer rainbow-table" ist zweifelhaft.
Gibt es keinen wirklichen Punkt bei der Speicherung von Salzen in einer separaten Datei, solange Sie sind auf einer pro-Benutzer-basis - der Punkt, der das Salz ist einfach so zu machen, dass eine rainbow-table kann nicht brechen jedes Passwort in der DB.
InformationsquelleAutor der Antwort Amber
Ich werde eine etwas andere Sicht auf diese.
Ich immer speichern, das Salz, gemischt mit den gesalzenen Passwort-hash.
Zum Beispiel, ich lege die erste Hälfte des Salzes, bevor die salted-hash des Kennworts, und die Letzte Hälfte des Salzes nach den salted-hash des Passworts. Die Anwendung ist bekannt, dass dieses design so Holen Sie diese Daten und rufen die Salz und gesalzenen Passwort-hash.
Meine Gründe für diesen Ansatz:
Wenn das Passwort/hash-Daten gefährdet ist, und fällt in die Hände eines Angreifers, kann der Angreifer nicht wissen, was das Salz aus der Betrachtung der Daten. Auf diese Weise wird ein Angreifer nicht praktisch durchführen einer brute-force-Attacke auf ein Paßwort erhalten, passt der hash, da er nicht weiß, wie der hash mit zu beginnen, und hat keine Möglichkeit zu wissen, welche Teile der Daten sind Bestandteile des Salzes, oder Teile von den gesalzenen Passwort-hash (es sei denn, er kennt Ihre Anwendung Authentifizierung Logik).
Wenn die gesalzenen Passwort-hash gespeichert ist, als-ist, dann ist eine brute-force-Angriff durchgeführt werden kann, erhalten Sie ein Passwort, das wenn gesalzen und gehasht erzeugt die gleichen Daten wie die gesalzenen Passwort-hash.
Jedoch, zum Beispiel, auch wenn die gesalzenen Passwort-hash gespeichert wurde, wird aber vorangestellt wird mit einem zufälligen byte, solange der Angreifer nicht bekannt ist, dass das erste byte wird verworfen werden, dies würde auch die Erhöhung der Schwierigkeit der Attacke. Ihre Anwendung kennen würde, Sie zu verwerfen, das erste byte der Daten für die Authentifizierung Ihres Benutzers.
Die Schlussfolgerung dieses..
1) Nie speichern der Daten, die Authentifizierung Anwendung verwendet in seiner genauen form.
2) Wenn möglich, halten Sie Ihre Authentifizierung Logik Geheimnis für zusätzliche Sicherheit.
Einen Schritt weiter gehen..
Wenn Sie nicht halten Sie Ihre Anwendung Authentifizierung Logik Geheimnis - viele Menschen wissen, wie Sie Ihre Daten in der Datenbank gespeichert ist. Und angenommen, Sie haben beschlossen, speichern die gesalzenen Passwort-hash vermischt und zusammen mit dem Salz, mit etwas von dem Salz vor dem salted-password-hash, und der rest des Salzes anzuhängen.
Beim generieren der zufälligen salt, konnte Sie auch nach dem Zufallsprinzip entscheiden, welchen Anteil Ihr Salz, die Sie speichern vor/nach den gesalzenen Passwort-hash.
Zum Beispiel, erzeugen Sie einen zufälligen salt von 512 bytes. Sie fügen Sie das Salz, um Ihre Kennwort ein, und erhalten die SHA-512-Hashwert Ihres gesalzen-Passwort. Sie erzeugen eine zufällige ganze Zahl 200. Speichern Sie dann die ersten 200 bytes von dem Salz, gefolgt von den gesalzenen Passwort-hash, gefolgt vom Rest des Salzes.
Beim authentifizieren eines Benutzers Passwort-Eingabe, Ihrer Anwendung übergeben Sie die Zeichenfolge, und übernehmen die ersten 1-byte der Daten ist die ersten 1-byte der Salz, gefolgt von den salted-hash. Dieser pass wird scheitern. Wird die Anwendung weiter, indem die ersten 2 bytes der Daten, da die ersten 2 bytes der Salz, und wiederholen, bis ein positives Ergebnis gefunden, nach der Verwendung der ersten 200 bytes als die ersten 200 bytes von dem Salz. Wenn das Passwort falsch ist, wird die Anwendung weiter zu versuchen, alle Permutationen, bis keine mehr gefunden werden.
Die Vorteile dieses Ansatzes:
Erhöhte Sicherheit - auch wenn Ihre Authentifizierung Logik ist bekannt, die genaue Logik unbekannt ist zur compile-Zeit. Es ist praktisch unmöglich, die Durchführung einer brute-force-Angriff, sogar mit Kenntnis der genauen Logik. Erhöht Längen von Salz erhöht die Sicherheit weiter.
Die Nachteile dieses Ansatzes:
Da die genaue Logik ist eine Schlussfolgerung, die zur Zeit ausführen, wird dieser Ansatz ist sehr CPU-intensiv. Je länger die Länge des Salzes, die mehr CPU-intensiv wird dieser Ansatz.
Authentifizierung falsche Passwörter werden, der mit dem höchsten CPU-Kosten. Dies kann kontraproduktiv sein, um rechtmäßige Anfragen, aber erhöht die Sicherheit gegen Angreifer.
Dieser Ansatz kann auf unterschiedliche Arten durchgeführt werden, und kann noch mehr zu sichern, indem durch variable-width-Salze und/oder gesalzene Passwort-hashes.
InformationsquelleAutor der Antwort Ibraheem
Oft werden Sie vorangestellt, um die hash gespeichert und in das gleiche Feld.
Gibt es keine Notwendigkeit, Sie separat speichern - der Punkt ist, verwenden Sie einen zufälligen salt für jedes Passwort, so dass eine einzelne rainbow-Tabelle kann nicht verwendet werden, gegen die gesamte Menge von Passwort-hashes. Mit random Salze, muss ein Angreifer brute-force-jeden hash einzeln (oder berechnen eine rainbow-Tabelle für alle möglichen Salze - erheblich mehr Arbeit).
Wenn Sie hatte einen sicheren Speicherort, würde es Sinn machen, nur speichern der hashes gibt.
InformationsquelleAutor der Antwort Andrew Medico
Basierend auf der Entwicklung ASP.NET MVC 4 Web-Anwendungen Buch von William Penberthy:
verschiedene Datenbanken, die Zugriff auf das Salz und das gesalzene Kennwort. Speichern Sie Sie in
die gleiche Tabelle wie das Passwort, oder auch eine andere Tabelle der gleichen Datenbank, würde
bedeuten, dass, wenn Hacker Zugriff auf die Datenbank haben Sie Zugriff auf die
Salz und den Passwort-hash. Denn Sicherheit umfasst den Prozess der Herstellung hacking
in das system zu teuer oder zeitaufwändig sein, lohnt es sich, die Verdoppelung der Menge
die Zugriffsrechte, die ein hacker hätte zu gewinnen, sollte das system sicherer werden.
Hash-Passwörter. Sie würde nicht haben, um sicherzustellen, dass zwei Datenbanken immer verfügbar sind
zur gleichen Zeit, und immer in sync. Der Vorteil ist, dass ein Salz ist minimal, wenn
jeder Benutzer hat eine randomisierte, Salz, weil, obwohl Sie es machen könnten, die Entdeckung der individuellen
Passwort einfacher, die Menge an Kraft notwendig, um knacken die Passwörter der
system insgesamt zu hoch sein wird. In dieser Ebene der Diskussion, dass ist wirklich das, was die Erwartung
ist: zum Schutz der Passwörter. Wenn die Hacker erworben haben, eine Kopie der Datenbank, Ihre
Anwendung Daten bereits kompromittiert. An diesem Punkt, das Problem zu mildern-Anwender'
Risiken, weil das Potenzial der gemeinsame Kennwörter.
fügt die Wahrnehmung von Sicherheit, aber der einzige Vorteil, den es gibt, ist, dass es schützt
ein Kennwort, ein einzelnes element von Daten. Wenn jedes Feld in der Datenbank wurden individuell
verschlüsselt, und das gleiche Salz verwendet wurde, für, dass es mehr Sinn machen würde, um es zu speichern
getrennt von den Daten, da die grundlegende Sicherheit Ihres Systems wird erhöht.
InformationsquelleAutor der Antwort DaNeSh