Ist es okay, zu speichern Salze mit hashes?
Mein Verständnis ist, dass ein Salz ist bestimmt nicht geheim, es ist lediglich dazu gedacht, anders zu sein als in einem zentralisierten standard, so dass Sie nicht entwickeln eine rainbow-Tabelle oder ähnlichen Angriffs zu brechen, alle hashes, die den Algorithmus verwenden, da das Salz bricht die rainbow-table. Mein Verständnis hier vielleicht nicht ganz richtig ist, also korrigiert mich wenn ich falsch Liege.
In eine weit verbreitete Stück open-source-software, das Salz wäre allgemein bekannt, und dieses öffnet Sie, um Angriffe denn nun können Sie einfach angreifen, die gesalzene version Ihres hash-und rainbow-Tabellen erstellen, die auch die Salz-Daten.
Wie ich es sehe, gibt es zwei Möglichkeiten, damit umzugehen. Die erste ist die Veränderung des Salzes sich mit jeder neuen version der software, aber das ist nicht gut, weil neue Versionen der software würde nicht mehr in der Lage sein, um test gegen alte Passwort-hashes.
Die zweite Lösung, die ich dachte, war eine salt pro Passwort gespeichert werden; in anderen Worten, jedes Passwort bekommt einen anderen Salz. Der Nachteil ist, dass die Salze haben, die im Zusammenhang mit der Passwort-hashes in irgendeiner Weise, die wahrscheinlich nur durch kleben Sie Sie rechts neben dem Passwort in der Datenbank. Es ist auch in Ordnung, verwenden Sie den Benutzernamen (es vielleicht nicht, aber wahrscheinlich Benutzernamen sind zu kurz).
Meine Frage ist, ist dies akzeptabel? Gibt es zusätzliche Risiken in Verbindung mit der Speicherung das Salz direkt mit der Passwort-hashes? Es scheint mir, dass das speichern das Salz in der source-code ist nicht anders, so gibt es keine Sicherheits-Verlust durch Lagerung des Salzes mit dem Passwort.
DISCLAIMER: ich bin nicht mit dieser für real-life-Sicherheit-system. In der Tat, ich habe nie entwickelt, ein Passwort-system jeglicher Art. Ich bin nur halten mich vage, bei der Aufklärungsarbeit zu Sicherheitsthemen.
- Es war ein toller Artikel diskutieren heute, sagte, dass, HMAC.
- Gibt es einen Grund, Salz + HMAC wäre unwirksam?
- +1 und wenn ich könnte, ich würde Euch gegeben haben, eine weitere Stimme einfach für deinen avatar 🙂
- Beachten Sie, dass dieser Artikel ist nicht über das speichern Kennwort. Es ist über den ursprünglichen Zweck der HMAC Authentifizierung von Nachrichten (signieren von Nachrichten). Aber natürlich HMAC ist eine gute Wahl für die Speicherung gesalzene Passwörter, zu.
- Aber nur um klar zu sein für Imagist, das Salz würde ein Teil der Eingabe für die HMAC-Funktion, so HMAC bedeutet nicht, das Salz ist das nicht sinnvoll.
- Was über Salze erzeugt von account-Informationen wie den Benutzernamen oder sogar ein Salz-basierend auf dem Passwort? Mir scheint, dies würde garantieren einzigartige Salze, und würde bedeuten, einen möglichen Angreifer müssten sowohl Ihre Datenbank und den Quell-code herauszufinden, der Salz verwendet.
- Eine Verwandte Frage: stackoverflow.com/questions/1479234/...
- Eine andere Frage im Zusammenhang: stackoverflow.com/questions/1645161/...
- B Off-topic ein bisschen, aber ich bin ein riesiger Domo-Enthusiasten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
update: verwenden Sie ein kompetenter Bibliothek z.B. passlib für Python.
Diese kümmern sich um die Generierung einer pro-Kennwort Salz und verwenden Sie eine richtige hashing-Algorithmus (dessen nicht genug, nur verwenden einer kryptographischen hash-wie SHA1; Sie haben, um es zu übernehmen in einer Weise, die macht es sehr langsam, um reverse-z.B. looping 1000 oder mehr mal über es, etc.. Dies ist, wie Passwort-hash-Funktionen wie bcrypt Arbeit. Kennwort speichern-Bibliotheken tun dies alles richtig; Sie verursachen in der Regel eine Zeichenfolge, Trennzeichen, so dass Sie bestimmen können, welche hash-system und arbeiten-Faktor, die Sie gerade speichern Sie die Zeichenfolge ohne dies zu wissen.
Können Sie speichern das Salz in 'plain-text' in der Tabelle.
Salt muss nicht geheim sein, um wirksam zu sein
es muss nur zufällig sein.
Das Salz stärkt Sie ein Kennwort, indem Sie den Hash-Wert vergleichen, den dasselbe Kennwort in der gleichen oder einer anderen Datenbank, und ungültig großen pre-generierte Listen von gemeinsamen Kennwort-hash-lookups (z.B. "rainbow tables").
Deshalb ist es wichtig, dass das Salz ist einmalig pro Kunde und ist einige zufällige Wert gespeichert, mit dem Kennwort, die alternativen beschrieben in der Frage (mit dem Benutzernamen, als das Salz über einen salt-Wert für die gesamte Anwendung) jedes scheitern:
wenn Systeme verwenden Sie den Benutzer-Namen oder andere Kleinigkeiten, dann das Passwort können Sie im Vergleich zu anderen Benutzern mit dem gleichen Namen, die in anderen Systemen (sich vorstellen, wie oft der Benutzer "administrator" oder "root" - Benutzerkonto verwendet das gleiche Passwort in verschiedenen Systemen...)
wenn das system verwendet einen einzelnen zufälligen salt für alle Benutzer in dem selben system, dann zwei Benutzer, die durch Zufall das gleiche Passwort hätte den gleichen hash, und raten zu einem Benutzer-Passworts trivial Kompromisse das andere.
Versucht zu halten, den salt secret ist sinnlos, weil die gesamte Praxis von Salzen und Hashen der Passwörter existiert nur, weil wir aus Erfahrung wissen, dass wir nicht halten unsere Datenbanken geheim mit absoluter Zuverlässigkeit. Sie können bei den meisten speichern das Salz separat und hoffen, dass ein Angreifer, der bekommt Zugriff auf Ihre DB nicht finden, aber wenn Sie ein guter Hash-Algorithmus und lange genug die einzelnen Salze, Sie sollten sicher sein, so oder so.
Der Punkt, der ein Salz ist allein, um sicherzustellen, dass Sie nicht amortisieren, die Kosten für eine brute-force-Angriff auf eine ganze Datenbank oder sogar mehreren Datenbanken.
Einer variation davon, die ich gesehen habe, ist zum generieren einer zufälligen salt während der installation (und natürlich halten diese in verschiedenen Versionen), so dass jede ausgeführte Instanz hat eine andere. Natürlich, mit einem anderen salt für jedes Passwort (vielleicht zusätzlich zu der vorstehend) ist noch besser.
Den Salz, per definition, muss zufällig sein, um wirksam zu sein. Verwenden Sie keine deterministischen Wert für diese. Dies impliziert freilich, dass Sie brauchen, um es zu speichern in der Datenbank zusammen mit dem Hash-Passwort. UNIX-Systeme traditionell sogar speichern den hash, der in dem gleichen Gebiet wie das Kennwort ein (das Salz ist ein fester Länge-Präfix Passwort). In einer Datenbank haben, können Sie die zusätzliche Spalte in der Tabelle users.
Ist es völlig normal, zu erzeugen, einem einzigartigen salt für jedes Passwort. Das Salz kann ein Produkt von vorhandenen material (wie beispielsweise eine Benutzer-id, et al.) oder zufällig generiert werden. Der Vorteil ist, dass ein Angriff gegen die verschlüsselten Informationen wird mehr unpraktisch als die Kraft des Salzes wächst.
Denken Sie daran: Jeder kryptografische Algorithmus ist zerbrechlich. Informationen können nur dann berücksichtigt werden, "sicher", wenn das knacken der Schutz (per rainbow-table oder anderweitig) ist teurer als die information Wert ist.
edit:
Vorausgesetzt, Sie sind sehr neu in die Kryptographie, hier ein paar weitere Tipps:
Deine zweite Lösung "Haben eine salt pro Passwort gespeichert" die richtige ist, und in der Regel verwendet.
Dem "Salz" ist in Erster Linie da, um es schwierig zu erkennen, wenn zwei Benutzer das gleiche Kennwort haben - so mischen Sie einen bekannten "Salz" in das Passwort. Das Salz muss sein get erreichbar password check Zeit.
In der Regel also entweder man generiert einen zufälligen salt und speichern Sie es mit dem Passwort, ODER Sie verwenden eine andere Kennung (Benutzer-ID, Benutzername etc) als das Salz.
Mit einem einzigen salt für alle Passwörter in der Datenbank ist hilfreich, aber viel weniger sicher ist, als was Sie jedem Benutzer eine eindeutige Salz.
Grundsätzlich: eine längere (in bytes) password+Salz erhöht den Suchraum, und so macht es schwieriger zu bedienen "- Aktien-standard" rainbow-Tabellen.
Jedoch, wenn Sie ebenfalls den gleichen salt verwendet für alle Einträge, dann ist es möglich, das erstellen einer rainbow-table - speziell Angriff Ihrer software. Wenn Ihr die userbase groß ist, dann könnte jemand entscheiden, um so eine Regenbogen-Tabelle.
Zum Beispiel, wenn Sie fügen Sie einfach "und eine Menge von Salz" am Ende jedes Passwort vor dem hashing kann ein Angreifer konstruieren Sie eine Tabelle der hash-Werte generiert, die von vielen Streichern, alle diese Zeichenfolgen mit der Endung "und eine Menge von Salz".
Deshalb ist es für pro-Benutzer-Salz ist der beste Weg zu gehen. Beachten Sie jedoch, dass Sie möchten, dass das Kennwort+salt zu "lange".
Wenn Sie möchten, verwenden Sie die primary key, ist es wahrscheinlich eine gute Idee, um die hash der primäre Schlüssel statt mit dem primären Schlüssel selbst, weil wenn das Passwort+salt für Benutzer 43 sieht aus wie "myPassword00000000043" dann könnte ein Angreifer eine Tabelle erstellen, mit der Annahme, dass es eine Menge Nullen in der Mitte. Erstellung von Zeitstempeln, und die zufällige Zeichenfolge, die sind wohl bessere Möglichkeiten, obwohl, wie PKeys kann manchmal leicht zu finden oder zu erraten.
Hinweis: ich bin keine echte Verschlüsselung-Experte, verwenden Sie nicht diese Beratung in einem realen system.
Du eigentlich schon haben Sie einen salt-Wert, gespeichert in der user-Tabelle: der Primärschlüssel der Tabelle.
Müssen Sie nicht erfinden eine neue Spalte für die Speicherung von Salz. Verwenden Sie einfach die pkey. Diese Idee, die natürlich voraussetzt, dass Sie wirklich eine pkey Zusammenhang mit einem user-Namen. z.B. der Benutzername ist nicht der Primärschlüssel in der Tabelle.
Dies ist ein in der Nähe dup wtb: Passwort-hashing, salt und Speicherung von Hash-Werten