Frage:
Verringert ein zu langes Salz die Sicherheit eines gespeicherten Passwort-Hash?
Piotr Müller
2014-11-25 13:53:12 UTC
view on stackexchange narkive permalink

Angenommen, wir haben Passwörter, die statistisch 7-8 Zeichen lang sind. Ist das Anhängen eines 200 Zeichen langen Salzes aufgrund der ähnlichen Hash-Funktionseingaben weniger sicher als ein 5 Zeichen langes Salz?

Ich habe mich gefragt: Was ist, wenn jemand versucht, das Salz zu erraten, indem er beispielsweise das Salz brutal erzwingt? das Passwort "123456" oder ein anderes beliebtes Passwort, das im System oder sogar auf einem bekannten Passwort aus dem eigenen Konto des Hackers gefunden werden kann?

Es macht keinen Sinn, ein Salt brutal zu erzwingen, da es für jedes gespeicherte Passwort unterschiedlich ist (oder zumindest sein sollte) und weil es ohnehin mit dem Hash-Passwort gespeichert ist, sodass ein Angreifer, der Zugriff auf die Passwort-Hashes hat, dies auch hat Zugang zu den Salzen.
Das Salz stärkt kein schlechtes Passwort. Es ist immer noch ein schlechtes Passwort.
Vielleicht lesen Sie [diese Antwort] (http://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190) darüber, was ein Salz ist und wie es "funktioniert".
@Gumbo Es gibt Benutzer mit Passwörtern, die so schwach sind, dass ein Salz nicht hilft. Und es gibt Benutzer mit Passwörtern, die so stark sind, dass kein Salz erforderlich ist. Es gibt aber auch Benutzer mit einer Passwortstärke irgendwo dazwischen, bei denen ein Salz den Unterschied macht, ob das Passwort kaputt geht oder nicht.
Fünf antworten:
Iszi
2014-11-25 14:47:07 UTC
view on stackexchange narkive permalink

Wie Mike und Gumbo in Kommentaren erwähnt haben, soll ein Salt schlechte Passwörter nicht schützen. Es soll die Angreifer davon abhalten, die gesamte Datenbank auf einmal zu beschädigen. Die Länge des Salzes soll das Brechen der gespeicherten Passwörter nicht erschweren. Es soll sicherstellen, dass Ihr Salz im Vergleich zu anderen im Internet einigermaßen einzigartig ist und (wenn Sie es richtig machen) keine zwei Ihrer Benutzer das gleiche Salz haben.

Stellen Sie sich vor, Sie haben 20 Benutzer die alle "Gott" als Passwort haben. Stellen Sie sich die folgenden Szenarien vor:

  1. Kennwörter sind ungesalzen
    Der Angreifer kann eine vorberechnete Tabelle verwenden, um das Kennwort eines Benutzers in sehr zu brechen em> kurze Bestellung. Darüber hinaus hat er, sobald er die erste der 20 hat, auch die anderen 19, da ihre Hashes identisch wären.

  2. Passwörter sind gesalzen. Das verwendete Salz ist ziemlich kurz. Für alle Benutzer wird das gleiche Salz verwendet.
    Der Angreifer muss möglicherweise etwas suchen, stößt jedoch möglicherweise auf eine vorberechnete Tabelle, die speziell für Ihre Konfiguration erstellt wurde. Nach diesem Punkt siehe Szenario 1.

  3. Kennwörter sind gesalzen. Das verwendete Salz ist ziemlich stark. Für alle Benutzer wird das gleiche Salz verwendet.
    Möglicherweise findet der Angreifer im Internet keine vorberechnete Tabelle für Ihr System. Er muss einen eigenen machen. Dies dauert etwas länger. Danach kehren wir jedoch wieder zu Szenario 1 zurück.

  4. Passwörter sind gesalzen. Das verwendete Salz ist ziemlich stark. Jeder Benutzer hat ein einzigartiges Salz.
    Dies ist, was Sie tun sollten . Der Angreifer kann nicht nur keine vorberechnete Tabelle für Ihr System finden, es lohnt sich auch nicht, seine eigene zu erstellen. Jede Vorverarbeitung, die er möglicherweise durchführt, funktioniert nur gegen einen Benutzer. Selbst wenn er einen der 20 zuvor genannten Benutzer trifft, kennt er die anderen 19 nicht, da die Hashes alle unterschiedlich sind. Jedes Passwort muss daher einzeln angegriffen werden, und das wird eine Weile dauern, wenn Sie auch einen starken und langsamen Hashing-Algorithmus verwenden, wie Sie es sollten. Die Chancen stehen gut, dass die schwachen Passwörter letztendlich immer noch kompromittiert werden. Der Angreifer braucht nur ein gutes Stück mehr Zeit, um alle zu überwinden, und Sie werden nicht feststellen, dass Teile Ihrer Benutzer sofort kompromittiert werden, nur weil sie dasselbe Kennwort haben.
  5. ol>

    Verwenden Sie also lange Salze und machen Sie sie für jeden Benutzer einzigartig. Aber rechnen Sie nicht damit, um einzelnen Benutzern viel zu helfen, wenn sie "Gott" als Passwort verwenden.

Szenario 2 ist unwahrscheinlich. Die Chance, einen solchen Regenbogentisch zu finden, ist sehr gering. In Szenario 2 und 3 können Sie jedoch selbst eine Regenbogentabelle erstellen, wenn Sie über genügend Ressourcen verfügen und das Salz kennen. Aus diesem Grund ist Option 4 so sicher - das Erstellen von Regenbogentabellen für alle Salze ist einfach zu viel Arbeit. Die Stärke des Salzes ist meiner Meinung nach nicht wirklich relevant, aber machen Sie es besser nicht zu schwach.
@SPRBRN Es gibt viele dumme Leute und schlechte Implementierungen da draußen. Ich wäre überhaupt nicht überrascht, wenn mindestens fünf Leute da draußen Zwei-Bit-Salze verwenden würden. Je länger deine ist, desto besser ist die Chance, dass du nicht mit der des nächsten übereinstimmst. Und die bessere Chance, dass Sie nicht zwei Benutzer mit demselben Salz haben.
Der Fragesteller spricht von einem Salz mit 200 Zeichen. Ich denke, er fragt, ob 200 sicherer ist als (so etwas wie) 20 oder ob es umgekehrt ist. Er spricht nicht über 2 Bits, oder sprechen Sie hier Bytes? Im Falle von 1 oder 2 Bytes werden vermutlich Regenbogentabellen verfügbar sein.
Kein kompetenter Angreifer würde sich die Mühe machen, einen Regenbogentisch für 3) zu erstellen. Ein direkter Mehrzielangriff ist mindestens genauso effizient. Eine Regenbogentabelle ist nur nützlich, wenn Sie Kennwörter mit demselben Hash zu unterschiedlichen Zeiten knacken möchten.
4. Sobald Sie 'Gott' erhalten haben, können Sie es Ihrem Wörterbuch hinzufügen und es für jedes Konto ausprobieren. Ist Ihre Benutzerbasis wirklich sicherer, es sei denn, sie ist riesig?
@Guillaume In dieser Diskussion geht es wirklich mehr um den Sicherheitsvorteil von Hashes, nicht so sehr darum, ob es eine gute Idee ist, "Gott" als Passwort zu verwenden. Selbst wenn es die Nummer 1 im Wörterbuch des Angreifers ist, wird es immer noch länger dauern, bis sie * jedem * Benutzer entsprechen, der dieses Passwort hat, wenn das Salt pro Benutzer eindeutig ist, als es sonst der Fall wäre. "Länger" ist natürlich relativ, aber immer noch ein Unterschied ungleich Null.
@CodesInChaos Fairer Punkt. Der gesamte Zweck von Salz besteht jedoch darin, den Vorteil der Vorberechnung von Hashes überhaupt zu eliminieren. Wenn Sie keine einzigartigen Salze pro Benutzer verwenden, gibt es immer noch einige Vorteile. Selbst wenn Sie im Vorfeld keine vollständige Tabelle erstellen, erstellen Sie effektiv eine, während Sie die Anmeldeinformationen der einzelnen Benutzer durchgehen.
@Iszi Der Sinn eines Salzes, um Angriffe mit mehreren Zielen zu verhindern, damit ich den Sicherheitsvorteil einzigartiger Salze nicht leugne. Die Vorberechnung ist jedoch nur eine Variante eines Mehrzielangriffs. IMO-Leute machen sich im Vergleich zu Live-Mehrzielangriffen zu viele Sorgen um Regenbogentabellen.
@SPRBRN Ich habe buchstäblich über zwei Bits gesprochen. Deshalb habe ich die spezifische Anzahl von fünf Personen ausgewählt. (Eigentlich hätte ich vier sagen sollen, aber mein mathematisches Gehirn ist noch nicht aufgewärmt.) Auf jeden Fall gelten die Aussagen zur Länge immer noch - je länger Ihr Salz ist, desto unwahrscheinlicher ist es, dass es mit dem eines anderen übereinstimmt und Je weniger wahrscheinlich Sie zwei Benutzer mit demselben Benutzer haben.
@Iszi, Ja, ich denke, aber für faule Programmierer sind zwei Bytes (oder Zeichen) möglicherweise noch einfacher zu programmieren als zwei Bits!
Du hast `0 vergessen. Passwörter sind nicht gehackt. "- Ich weiß, es klingt dumm, aber es passiert!
Wie werden diese Salze gelagert? Wenn sie neben dem Hash-Passwort gespeichert sind, geht es nicht zurück zu Szenario 1?
@Qix Das Salz soll kein Geheimnis sein. Selbst wenn der Angreifer das Salz kennt, weiß er immer noch nicht, welche anderen Daten (d. H. Passwort) in die Hashing-Funktion eingegeben wurden, um die angegebene Ausgabe zu generieren.
kasperd
2014-11-26 02:52:24 UTC
view on stackexchange narkive permalink

Ein zu langes Salz verringert die Sicherheit nicht. Ein zu kurzes Salz verringert die Sicherheit.

Wenn das Salz länger wird, verbessert sich die Sicherheit. Irgendwann werden Sie eine Grenze überschreiten, wo Sie mit zunehmender Salzlänge abnehmende Renditen erzielen. Und irgendwann werden Sie eine andere Grenze überschreiten, an der ein längeres Salz keinerlei Sicherheit bietet.

Da ein längeres Salz jedoch keine nennenswerten Kosten verursacht, gibt es kaum einen Grund, die Verlängerung bis zu Ihnen zu beenden die zweite Grenze erreichen. Selbst wenn Sie die Salzlänge darüber hinaus erhöhen, besteht der einzige Nachteil in geringen zusätzlichen Kosten in Bezug auf Lager- und Verarbeitungszeit.

Leider werden Salze häufiger mit einer Länge unterhalb des unteren der beiden Schwellenwerte erzeugt

Was sind also die beiden Schwellenwerte?

Der untere Schwellenwert wird durch die Anzahl der Benutzer und den Zweck des Salt bestimmt, der für jedes jemals gewählte Passwort unterschiedlich sein soll jeder Benutzer. Wenn wir einige konservative Schätzungen vornehmen, beträgt die Anzahl der Benutzer weltweit weniger als 10 ^ 10, und jeder Benutzer hat Kennwörter für weniger als 10 ^ 2 Systeme, und im Laufe seiner Lebensdauer ändert sich dieses Kennwort weniger als 10 ^ 3 Mal. Das bedeutet, dass es insgesamt weniger als 10 ^ 15 Passwörter gibt. In Anbetracht dessen könnte man fälschlicherweise den Schluss ziehen, dass 50 Bit Entropie im Salz ausreichen, um zu gewährleisten, dass sich niemals zwei Salze wiederholen, aber aufgrund des Geburtstagsparadoxons müssen wir diese Zahl verdoppeln.

Also einmal Das Salz wächst länger als 100 Bit. Wir sehen abnehmende Renditen in Bezug auf zusätzliche Sicherheit. Die 100-Bit-Schwelle war mit viel Raten verbunden. Die nächste Schwelle beinhaltet viel weniger Raten. Mehr als 100 Bit Entropie im Salz verbessern die Sicherheit immer noch, nur nicht wesentlich.

Sobald das Salz länger als die Ausgabe der zugrunde liegenden Hash-Funktion wird, gibt es jedoch keine zusätzliche Sicherheit, wenn es hergestellt wird länger. Was der Schwellenwert ist, hängt von der Hash-Funktion ab. Diese reichen von 128 bis 512 Bit für typische Hashes.

Denken Sie daran, dass Salze normalerweise mit 6 Bit Entropie pro Zeichen erzeugt werden. Sie benötigen also 86 Zeichen Salz, um die 512 Bit Entropie zu erreichen.

Wenn Sie dem Passwort also ein wirklich sehr langes Salz hinzufügen, wird das Passwort nie bis zu einem gewissen Grad "übertönen", was es einfacher macht, ein Passwort mit demselben Hash zu finden? Ist dies eine Eigenschaft der von uns verwendeten Hash-Funktionen?
@Jens Ja. Wir wählen normalerweise Hashing-Funktionen aus, die den [Lawineneffekt] aufweisen (http://en.wikipedia.org/wiki/Avalanche_effect), was bedeutet, dass (im Idealfall) jedes einzelne Bit in der Eingabe geändert wird (oder ein einzelnes zusätzliches Bit hinzugefügt wird) bewirken, dass sich ungefähr die Hälfte der Bits im Ausgang ändert. Daher ändert das Kennwort, selbst wenn es nur 1 Bit lang ist, die Ausgabe des Hashs genauso stark wie das Ändern des gesamten Salt für ein neues, unabhängig von seiner Länge.
@Jens Wenn dies der Fall wäre, würde dies als große Schwäche in der Hash-Funktion angesehen. Es wird empfohlen, eine Hash-Funktion ohne bekannte Schwachstellen zu verwenden. Das Passwort-Hashing kann so strukturiert werden, dass das Risiko des von Ihnen beschriebenen Szenarios minimiert wird, selbst wenn sich herausstellt, dass der Hash schwach ist. Zum Beispiel könnte man einfach das Salz vor das Passwort setzen und berechnen: h (salt || Passwort)
Verwenden Sie einfach ein Salt mit der Länge des Hash-Codes, es entspricht der maximalen Entropie des Hash und dem Passwort. Längere Salze nützen nichts. Warum sollten Sie sich Gedanken über die Speichergröße der Salt-Spalte in Ihrem (keinen) SQL-Speicher machen? Die Gesamtzahl der Salzbytes wächst linear mit der Größe Ihrer Benutzerbasis, die in jedem realistischen Arbeitssystem im Vergleich zu der für jeden (alle) Benutzer gespeicherten Datenmenge klein sein sollte. Sizeof (Authentifizierungsdaten) << Sizeof (Alle anderen Systemdaten).
@AndrewPhilips Das ist die Schlussfolgerung, zu der meine Antwort führt.
@kasperd Fair genug - ich habe Ihre Antwort ein wenig verkürzt. ;)
Xander
2014-11-26 03:13:03 UTC
view on stackexchange narkive permalink

Die einzige Eigenschaft eines Salzes, die aus Sicherheitsgründen wichtig ist, ist, dass es global eindeutig ist. Die Länge kann sich darauf auswirken, wie einzigartig das Salz sein kann, ist jedoch aus jeder anderen Perspektive irrelevant. Unter der Annahme, dass es sich positiv oder negativ auf irgendetwas auswirkt, muss das Salz gebeten werden, eine Funktion auszuführen, die es niemals erfüllen sollte.

Ein Salz sollte also lang genug sein, um die Einzigartigkeit angemessen sicherzustellen, und das auch ist Alles. Vorausgesetzt, Ihr Salz hat eine gute Einzigartigkeit, wirkt sich dies nicht mehr positiv oder negativ auf die Sicherheit aus, sondern verschwendet mit Sicherheit Speicherplatz.

Global Unique ist möglicherweise nicht praktisch für große Bevölkerungsgruppen, wird jedoch "in jeder Hinsicht" und für alle Zwecke vereinbart. Wenn ich einen schwarzen Hut trage, habe ich bereits einige (oder viele) Passwörter und möglicherweise sogar Salze. Verstöße aufgrund schlechter Passwörter oder schlechter Passwortverwendung werden durch Ihr eigenes System übertragen. Die zufällige Auswahl des Benutzernamens / der E-Mail hilft. Dies muss jedoch von der Benutzerseite aus erfolgen. Leider verwenden viele die gleichen Werte oder Ableitungen für das Leben. Letztendlich streben wir eine Authentifizierung durch Dritte an, damit die Aufgabentrennung durchgesetzt wird. Wenn SSL / RSA nicht vertrauenswürdig ist, wo sind wir dann?
@mxkenzm weltweit einzigartig wird wahrscheinlich, wenn die Anzahl der potenziellen Salze größer als das Quadrat der Anzahl der Passwörter ist. Für die absehbare Zukunft sollten 128 Bit für diesen Zweck ausreichen.
Eine monoton ansteigende Sequenz ist garantiert global eindeutig (1, 2, 3, ...). Ich denke nicht, dass dies die "einzige Eigenschaft" ist, die wichtig ist. Verwenden Sie ein zufällig generiertes Salt mit der gleichen Länge wie der Passwort-Hash, und es ist sehr wahrscheinlich, dass Sie nicht nur ein systemweit einzigartiges Salt haben, sondern auch ein weltweit einzigartiges Salt.
Relaxed
2014-11-26 18:29:54 UTC
view on stackexchange narkive permalink

Andere haben sich zur richtigen Verwendung von Salzen und Passwörtern geäußert, aber vielleicht ist es nützlich, ein Wort zu Hash-Funktionen hinzuzufügen, da Ihre Frage auf eine etwas falsche Intuition ihrer Funktionsweise hindeutet.

Von Natur aus Eine gute kryptografische Hash-Funktion sollte Sie nicht erraten lassen, wie ähnlich die Eingaben basierend auf den Hash-Werten selbst waren. Andernfalls könnte es umgekehrt werden, indem dieser Abstand schrittweise verringert wird, was viel weniger kostspielig wäre als das reine Brute-Force-Raten. Daher sollte Hash (salt1 + "12345") Hash (salt1 + "67890") oder Hash ("12345") nicht ähnlicher sein als Hash (salt2 + "67890").

The Der springende Punkt ist, sicherzustellen, dass die Eingaben (und damit der Hash) nicht identisch sind, auch wenn zwei Konten zufällig dasselbe Kennwort verwenden, Ähnlichkeit jedoch keine sein sollte Problem.

thomasrutter
2014-11-27 09:59:21 UTC
view on stackexchange narkive permalink

Die Länge eines Salzes folgt dem Gesetz der Verringerung der Rendite.

  • Zu keinem Zeitpunkt wird ein Salz weniger sicherer, wenn es länger ist,

  • , aber es tut es Hören Sie auf, relativ schnell sicherer sicherer zu werden.

  • Sie "knacken" niemals ein Salz - was Sie knacken, ist das Hash-Passwort, für das das Salz wird angehängt. Das Salz adressiert nur die Bedrohung durch Regenbogentabellen - die Möglichkeit, vorberechnete Haschentabellen zu finden, sodass Sie den mühsamen Prozess des Brute-Forcing überspringen können.

    Zu diesem Zweck benötigen Sie lediglich lange genug Salze dass noch niemand umfassende Regenbogentabellen für all diese möglichen Salze erstellt hat. Und aufgrund der Kosten für die Erstellung einer Regenbogentabelle und des exponentiellen Anstiegs der Anzahl der Salze, die Sie berechnen müssen, wenn Sie die maximale Salzlänge erhöhen, ist dies keine sehr schwierige Anforderung: Nur wenige Zeichen Salz sind bereits vorhanden Es ist sehr wahrscheinlich, dass niemand umfassende Regenbogentabellen für Salze Ihres Formats berechnet hat.

    Um aus dem Nichts einen zufälligen Wert auszuwählen, sind Salze mit beispielsweise 16 Hex-Zeichen oder mehr recht gut. Angenommen, Ihre Methode zur zufälligen Auswahl weist keine ausnutzbaren Mängel auf.

    Darüber hinaus wird die Erhöhung der Sicherheit immer vernachlässigbarer.

    Warum bei 16 hex anhalten? Das sind nur 64 Bit Entropie für das Salz und niedrig genug, um auf einige Salzwiederholungen zu stoßen, was jedoch unwahrscheinlich ist. Stellen Sie Salt Length einfach auf die gleiche Länge wie die Hash-Ausgabe ein. Längere Salze haben per Definition keine Entropie mehr, kürzere Salze haben weniger Entropie und sind weniger effektiv. Schließlich kann die Speicherung kein Problem sein. Was auch immer das S / W tut, es benötigt mehr Speicher als einige einfache alte Benutzerauthentifizierungsbits.
    Ich kann das Argument sehen, mindestens die gleiche Menge an Entropie im Salz wie im Hash zu verwenden. Die Vermeidung von Salzkollisionen ist jedoch nicht das Ziel. Mein Punkt war, dass aufgrund der relativen Kosten (CPU und Speicher) für die Erzeugung separater Regenbogentabellen für viele Salze schnell sinnlos wird und die 64-Bit-Entropie lange nach diesem Punkt liegt. Es ist plausibel, dass jemand 65.536 Regenbogentabellen (eine pro Salz) (16-Bit-Salze) vorberechnen und speichern könnte. Sehr unwahrscheinlich, dass jemand 4.294.967.296 Regenbogentabellen (32-Bit-Salze) erzeugen und speichern kann. Und 64-Bit-Salze gehen weit darüber hinaus.
    Weil die Kosten für die Verwendung der maximalen Salzlänge im Vergleich zu potenziellen zukünftigen (unvorhergesehenen) Problemen oder Fehlern ebenfalls minimal sind. Warum sollten Sie später herausfinden, ob Sie sich eine Auswahl ausgesucht haben, die die beste ist, die Sie hätten treffen können, aber die Sicherheit Ihres Systems (und der Benutzer) in keiner Weise beeinträchtigt hat? Die Auswahl von 64 Bit kann nach aktuellem Kenntnisstand praktisch der von 128 oder 160 oder 256 entsprechen. Algorithmen sind jedoch immer leichter zu brechen, nicht schwerer. Wenn die Kosten für Lagerung / Verwendung minimal sind, bietet die maximale Salzentropie ein gewisses Maß an Versicherung.


    Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
    Loading...