Password Hashing, Salden und Speichern von Hashwerten
Angenommen, Sie waren in Freiheit zu entscheiden, wie die Hash-Passwörter werden gespeichert in einem DBMS. Gibt es offensichtliche Schwächen in einem System wie diesem?
Erstellen der hash-Wert gespeichert, der in das DBMS nehmen:
- Ein Wert, der einzigartig ist auf dem DBMS-server-Instanz als Teil der Salz,
- Und den Benutzernamen als zweiter Teil von das Salz,
- Und erstellen Sie die Verknüpfung von Salz durch das eigentliche Passwort,
- Und hash der ganze string mit dem SHA-256-Algorithmus,
- Und speichern Sie das Ergebnis in das DBMS.
Dies würde bedeuten, dass alle wollen, kommen mit einer Kollision zu tun haben sollten, die Arbeit für jeden Benutzer separat Namen und jeder DBMS-server-Instanz getrennt. Ich würd den plan zu halten, der eigentliche hash-Mechanismus etwas flexibel für den Einsatz der neuen NIST standard-hash-Algorithmus (SHA-3) , wird noch gearbeitet.
'Wert, ist einzigartig auf dem DBMS-server-Instanz" muss nicht sein Geheimnis, aber er würde nicht weitergegeben werden, beiläufig. Die Absicht ist es, sicherzustellen, dass, wenn jemand nutzt das gleiche Passwort in verschiedenen DBMS-server-Instanzen, die aufgezeichnet hashes anders sein würde. Ebenso der Benutzer name nicht geheim - nur das richtige Passwort.
Gäbe es irgendeinen Vorteil, dass Sie zunächst das Kennwort und den Benutzernamen und 'eindeutiger Wert' zweite, oder jede andere permutation der drei Quellen der Daten? Oder was ist mit interleaving die Fäden?
Muss ich hinzufügen (und Aufzeichnung) ein zufälliger salt-Wert (per Passwort) sowie die oben genannten Informationen? (Vorteil: die Benutzer können re-verwenden Sie ein Passwort, und immer noch, wahrscheinlich, bekommen einen anderen hash in der Datenbank aufgezeichnet. Nachteil: das Salz muss aufgezeichnet werden. Ich vermute, der Vorteil deutlich überwiegt den Nachteil.)
Gibt es eine ganze Reihe von verwandten Fragen - diese Liste ist unwahrscheinlich, umfassend:
- Verschlüsseln/Hashen Passwörter im Klartext in der Datenbank
- Der Secure-hash-und salt für PHP Passwörter
- Die Notwendigkeit des Versteckens der salt-hash
- Kunden-Seite MD5-hash mit der Zeit Salz
- Einfache Passwort-Verschlüsselung
- Salz-generation und Open-Source-software
- Passwort-hashes: fester Länge binäre Felder oder einzelne string-Feld?
Ich denke, dass die Antworten auf diese Fragen unterstützen, meinen Algorithmus (obwohl, wenn Sie verwenden einfach eine zufällige Salz, dann die 'eindeutigen Wert pro server", der Benutzername und Komponenten sind weniger wichtig).
InformationsquelleAutor der Frage Jonathan Leffler | 2009-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Salz muss sich nur zufällig und einzigartig. Es kann frei bekannt, wie es hilft nicht, ein Angreifer. Viele Systeme speichern die nur-text-salt in der Datenbank in der Spalte rechts neben das gehashte Kennwort.
Das Salz hilft, um sicherzustellen, dass wenn zwei Personen (Benutzer A und Benutzer B) zufällig teilen Sie dasselbe Kennwort es nicht offensichtlich ist. Ohne den zufälligen und einzigartigen salt für jedes Passwort der hash-Werte wären die gleichen, und natürlich, wenn das Passwort für den Benutzer Ein gesprungen ist, dann muss Benutzer B haben das gleiche Passwort.
Es hilft auch, schützen Sie sich vor Angriffen, bei denen ein Wörterbuch der hashes abgeglichen werden kann, gegen bekannte Passwörter. z.B. rainbow-Tabellen.
Ebenfalls mit Hilfe eines Algorithmus mit einem "work factor" gebaut, in der auch bedeutet, dass die Rechenleistung erhöht die Arbeit ein Algorithmus muss durch zu gehen, um das erstellen der hash-kann auch erhöht werden. Zum Beispiel, bcrypt. Dies bedeutet, dass die Wirtschaft der brute-force-Angriffe unhaltbar geworden. Vermutlich wird es viel schwieriger für das erstellen von Tabellen mit bekannten hashes, da Sie länger dauern, um zu erstellen; die Variationen in den "Faktor Arbeit" bedeutet mehr Tische gebaut werden müssen.
InformationsquelleAutor der Antwort Colin Mackay
Ich denke, Sie sind über-komplizieren das problem.
Beginnen mit dem problem:
Den Mechanismus, den Sie vorschlagen, bedeutet Schutz vor einem einfachen rainbow-Angriff, dazu führen, auch wenn Benutzer A und Benutzer B haben das GLEICHE Passwort, das gehashte Passwort wird anders sein. Es tut scheinen wie eine eher aufwendige Methode zu sein, das Salzen ein Passwort, das ist zu kompliziert.
Sondern ich möchte nur hinzufügen, dass die extra-Spalte und speichern Sie eine richtige random-Salz. Dies würde den Schutz gegen jede Art von rainbow-table-Angriff. Über mehrere Bereitstellungen.
Aber es schützt Sie nicht gegen eine brute-force-Angriff. Also, wenn Sie versuchen, um Benutzer, die haben beschissene Passwörter, müssen Sie woanders suchen. Zum Beispiel, wenn Ihre Benutzer 4 Buchstaben-Passwörter, es könnte wahrscheinlich in Sekunden knackbar, auch mit Salz und den neuesten hash-Algorithmus.
InformationsquelleAutor der Antwort Sam Saffron
Ich denke, Sie müssen sich selbst Fragen, "Was erhoffen Sie sich durch diese komplizierter als nur die Erzeugung eines zufälligen salt-Wert und speichern?" Je komplizierter Sie Ihren Algorithmus, desto wahrscheinlicher ist die Einführung einer Schwäche versehen. Dies wird wahrscheinlich snarky Ton, egal wie ich es sage, aber es ist hilfreich gemeint - was ist das Besondere an Ihrer app, die es braucht, ein schickes neues Passwort-hashing-Algorithmus?
InformationsquelleAutor der Antwort Peter Recore
Warum nicht noch ein random salt zum Passwort-und hash, die Kombination. Neben verketten hash und Salz zu einem byte[] und speichern in die db?
Den Vorteil einer zufälligen salt ist, dass der Benutzer frei ändern Sie den Benutzernamen. Der Salt muss nicht geheim sein, da es verwendet, um zu verhindern Wörterbuch-Attacken.
InformationsquelleAutor der Antwort Paul van Brenk