Wie wählen Sie ein Salz für eine hash-Funktion gedacht, um Passwörter schützen?
Ich bin eine (totale) Anfänger, und dies ist mein Erster Ausflug in die "Verschlüsselung" in der Tat ist dies wahrscheinlich das erste mal, dass ich das Wort.
Hier meine Frage: Für einen nicht-banking /Militär, oder auch kommerzielle, web-app, was ist der richtige Weg zu wählen, ein Salz für eine hash-Funktion für Passwörter verwendet?
Ich kann einfach erzeugen eines pseudo-zufälligen salt für jeden neuen Benutzer, und fügen Sie das Salz auf Ihrer pw vor dem anwenden der hash-Funktion. Aber ich muss noch speichern das Salz also vermutlich jeder, der erhält Zugriff auf die Hash-Passwörter bekommt auch die Salze.
Ist der Vorteil, das Salz einfach zu machen, das pw "eher zufällig", und daher die Niederlage der standard dictionary-basierte rainbow-Tabellen?
Würden alle der folgenden gut & praktische Ideen:
- Speichern das Salz in eine separate db - vielleicht ein separates system, auf jeden Fall einen anderen host, name, pw, etc.
- Generieren, das Salz auf der Basis der hash des Benutzernamen (oder ersten+letzten Namen oder Zeichen Datum), vermutlich mit einer anderen hash-Funktion? Dann das Salz selbst würde nicht gespeichert werden in der db nur die Daten verwendet, um zu berechnen, es würde...
- Speichern in der db ein Wert ist, der wird das gehashte pw und das Salz in eine nicht offensichtliche Art und Weise (z.B. das Salz 10 zufälligen Schlüssel, und Sie injiziert werden innerhalb der gehashte pw zwischen dem Buchstaben-zahlen 1&2, 4&5, 8&9, etc).
Als eine Seite Frage, wie einfach ist es zu ändern, ein salted hash-Algorithmus bei der Aktualisierung der software von der website? Es fühlt sich beklemmend jetzt.
- Duplizieren: stackoverflow.com/questions/1191112/...
- Danke. Nicht Adresse 1, 2, und 3 - oder bin ich etwas fehlt?
- Es gibt eine MENGE von Informationen über diese bereits über. Kurz gesagt: per-user-Salze, verwenden Sie ZUFÄLLIGE Daten, die für die Salz und Mach dir keine sorgen über die "Sicherung" der Salze, wie Sie sind nicht geheim, Sie als solche.
- Wenn Sie gerade eine GUID-id für den Benutzer in der Datenbank; dies kann als eine ausgezeichnete Quelle für die salt-bytes.
- DanP - Exzellente, input, danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Beantwortung Ihrer Zwischenfrage: auch stash eine Algorithmus-ID (möglicherweise eine einfache Zahl, möglicherweise ein name-string) zusammen mit den Daten. Wie Sie zu aktualisieren, Sie hash-neue Kennwörter mit dem neuen, bevorzugten Algorithmus, aber behalten Sie die alten Algorithmus, bis alle Ihr Kennwort geändert und es gibt keine gespeicherten Kennwörter mithilfe des alten Algorithmus. Wieder, dies muss nicht geheim sein - es ist nur erlaubt Ihnen, sich auf die Veränderungen in der Welt. Klar, wenn der alte Algorithmus ist plötzlich ausgesetzt als wertlos, Sie denken darüber nach, ob es OK ist die Verwendung der inkrementellen Ansatz. Aber wenn etwas Dramatisches wie das geschieht, ein "phasing in" der neue Mechanismus funktioniert sehr gut. Versuchen Sie nicht, ändern Sie Ihren Algorithmus so oft, dass Sie drei oder mehr die auf einmal unterwegs sind - obwohl es keinen technischen Grund, dass das System nicht verwalten. Auch versuchen Sie, entwerfen Sie Ihre Datenbank so, dass die hash-Größen wachsen können, ohne dass Verwerfungen (so können Sie Platz für die Erweiterung von 64 auf 128 bytes, oder von 128 auf 256, oder ...).
Ja, das Salz ist nur da, um zu verhindern, dass Regenbogen-Attacken auf den Hash-Passwörter. In der Regel verwende ich ein einziges salt-Wert für alle Passwörter. Es ist gespeichert in meinem source-code oder die Konfiguration, so dass es nicht in der Datenbank. Aber es ist wahrscheinlich besser, verwenden Sie ein anderes Salz für jeden Benutzer. So, zwei Benutzer mit dem gleichen Passwort erhalten nicht die gleiche hash.
Können Sie einfach speichern Sie das Salz in der Datenbank zusammen mit dem Passwort. Das Objekt des Salzes ist, dass man nicht vorausberechnen rainbow-Tabelle. Es würde zu viel Zeit. Mehr Zeit, als einfach brute-forcen Passwort direkt. Selbst wenn der salt bekannt ist, die komplette rainbow-Tabellen für das Salz hätte erzeugt werden, die extrem teuer zu tun. Es spielt also keine Rolle, viel, wenn der salt bekannt ist.
Es ist völlig egal, wie Sie wählen Sie Ihre Salz, so lange wie Sie sicherstellen, dass es lang genug ist. Laut Wikipedia ein 12-bit-hash (der verwendet durch alte unix-Passwörter) ist extrem teuer besiegen, aber möglich. 128-bit (wie z.B. MD5) zu teuer ist defeaut in absehbarer Zukunft.
Siehe auch: http://en.wikipedia.org/wiki/Rainbow_table#Defense_against_rainbow_tables
Salze sind nicht geheim. Sie können gespeichert werden, im Klartext, zusammen mit dem Hash-salt+Passwort. Hashes sind gesalzen zu vermeiden Wörterbuch-Attacken. Salzen mit einem zufälligen Wert gespeichert, zusammen mit dem Passwort oder Vermischung der Benutzername sowie das Kennwort sind beide Optionen zulässig. Ich würde allerdings empfehlen, eine sehr bestimmten hash-Schema, nämlich der HTTP - Digest-HA1 hash:
user_name : realm : password
. Dies hat den Vorteil, in der Lage sein, um die HTTP Digest-Authentifizierung fordert, das ist, was würde die Authentifizierung verwendet werden, für die automatisierte Zugriff, wie eine REST API-Programmierung Ihrer Website.Bevor man springt zu verurteilen, die Verwendung von MD5 statt SHA1 (wie erforderlich, durch den die HTTP Digest-hash-Schema), sondern die Bereitstellung von on-demand-MD5-hash-Kollision für die Digest-Schema ist bei weitem noch nicht umsetzbare, in absehbarer Zukunft, und dem zusätzlichen Vorteil der automatisierten Zugriff (denke WebRequest, curl, etc) ist nicht zu vernachlässigen.