Frage:
Müssen Salze zufällig sein oder nur einzigartig und unbekannt?
user26547
2013-09-01 10:08:25 UTC
view on stackexchange narkive permalink

Zunächst einmal möchte ich vermeiden, das Salz in der Datenbank als einfachen Text zu speichern. Bei dieser Frage wird das Salz nicht in der Datenbank gespeichert.

Nach Diskussion in Kommentaren und im Chat, ich habe mir eine Theorie ausgedacht:

Es scheint, dass die Verwendung von doman_name + Benutzer-ID neben einem Pfeffer eine ausreichende Kombination von bietet Zufälligkeit und Eindeutigkeit.

Würde eine solche Methode genauso viel Sicherheit bieten wie ein zufälliges Salz, ohne dass ein bestimmtes Salz als einfacher Text in der Datenbank gespeichert werden muss?

Das Aufrufen eines Hash wie sha-256 erzeugt überhaupt keine Entrophie. Die Anzahl der möglichen Eingaben legt die Anzahl der möglichen Hashwerte fest.
Wenn die Eingabe unbekannt ist (wie ein Passwort), gibt es keine Entropie?
Ummm ich glaube ich habe das schon gefragt http://security.stackexchange.com/questions/33860/how-does-hashing-work
@Griffin - Ich denke, die Frage des OP lautet tatsächlich: "Kann das Speichern eines Salzes vollständig vermieden werden, indem das Salz von der Benutzer-ID, dem konstanten Text und dem Passwort selbst abgeleitet wird?"
@martinstoeckli Warten Sie, er möchte jedes Mal das Salz ableiten? Und was bringt es überhaupt, wenn er das Passwort und die ID als Klartext speichert?
Oder will er nur 1 Salz, das ihm sowohl den Benutzernamen als auch das Passwort gibt?
@Griffin Ich möchte ein Salz, das nicht erraten werden kann und unbekannt ist, ohne dafür ein anderes Feld in meiner Datenbank erstellen zu müssen. Wenn ich das Passwort (unbekannt) und die Benutzer-ID (eindeutig pro Konto) und den Domainnamen (eindeutig pro Website) verwende und es genauso sicher ist wie eine zufällige Nur-Text-Zeichenfolge, warum nicht die erste Methode wählen? Die erste Methode erfordert ein Stück weniger.
@Griffin - Das Klartextkennwort muss nicht gespeichert werden, da bei Überprüfung des Kennworts alle erforderlichen Informationen, die Benutzer-ID, der konstante Text und das gerade eingegebene Kennwort verfügbar sind.
AilibhkwrhCMT Okay.
@MisterMelancholy "unbekannt" "Entropie" Ich denke, Sie müssen die Definition von "Entropie" überprüfen. Es bedeutet nicht "Ich kenne die Antwort nicht", es ist an die Wahrscheinlichkeit gebunden, die Antwort mit * x * Versuchen richtig zu erraten. * Praktisch bedeutet viel Entropie, dass Sie niemals die richtige Antwort erraten können, selbst wenn Sie so viel wie möglich in Ihrem Leben versuchen. *
@curiousguy Ich habe [diese Erklärung der Entropie] gelesen (http://security.stackexchange.com/questions/21143/confused-about-password-entropy). Ich dachte ursprünglich, dass es "Zufälligkeit" bedeutet, aber es scheint "das Niveau der Zufälligkeit" zu bedeuten. Ich habe meine Frage aktualisiert, um dies widerzuspiegeln (glaube ich). Danke für die Eingabe
Siehe auch http://stackoverflow.com/q/536584/10080. Es sind einige interessante Aspekte zu berücksichtigen.
Sechs antworten:
user10211
2013-09-01 10:36:13 UTC
view on stackexchange narkive permalink

Die einzige Anforderung an ein Salz besteht darin, global eindeutig zu sein. Es muss nicht zufällig sein und es muss mit Sicherheit nicht unbekannt sein.

Beachten Sie das Schlüsselwort global . Ein Salt muss nicht nur im Kontext Ihrer Datenbank eindeutig sein, sondern auch im Kontext jeder einzelnen Datenbank da draußen. Es ist (sehr) unwahrscheinlich, dass eine E-Mail oder eine inkrementelle Benutzer-ID diese Anforderung erfüllt. Die Verwendung eines zufällig generierten Salt funktioniert.

BEARBEITEN

Ich werde das Ganze mit einer -Domäne + Benutzer-ID ansprechen als Salzidee, die in den Kommentaren auftauchte. Ich halte dieses Schema nicht für eine gute Idee, insbesondere im Vergleich zur Verwendung eines zufälligen Salzes.

Wenn Ihre Site ein hohes Ziel ist, kann es für einen Angreifer sinnvoll sein, eine Regenbogentabelle zu erstellen, die auf den Administrator abzielt Konto, bevor der Angriff auftritt. Dies kann ihm den Zugriff ermöglichen, bevor der Angriff entdeckt wird. Das Schema domain + userid funktioniert in dieser Situation nicht gut, da sich das Administratorkonto normalerweise innerhalb der ersten userid s im System befindet, insbesondere wenn userid wird mithilfe eines Zählers inkrementiert.

Abgesehen davon ist diese ganze Diskussion in der Praxis wirklich umstritten. Die Erzeugung von zufälligen Salzen ist einfach und schnell. Viele Passwort-Hashing-Bibliotheken, insbesondere die bcrypt , erledigen dies bereits für Sie. Es macht wirklich keinen Sinn, ein eigenes Schema zu erstellen, auch wenn es genauso sicher ist. Seien wir ehrlich, wir sind alle faule Leute, nicht wahr? : P Warum das Rad neu erfinden?

Technisch gesehen bietet die Verwendung unvorhersehbarer Salze einen geringen Vorteil, da verhindert wird, dass ein Angriff einen Brute-Force-Angriff startet, bevor Ihre Kennwortdatenbank kompromittiert wurde. Aber Sie haben Recht damit, dass (globale) Einzigartigkeit viel wichtiger ist.
Wenn Sie aus irgendeinem Grund keine zufälligen Salze verwenden möchten, könnte die Anforderung der globalen Eindeutigkeit erfüllt werden, z. durch Kombinieren eines lokal eindeutigen Werts pro Benutzer (z. B. einer E-Mail-Adresse oder einer Benutzer-ID-Nummer) mit einer global eindeutigen System-ID (z. B. dem Domänennamen der Website).
Eine E-Mail würde wahrscheinlich keine allgemeine Eindeutigkeit bieten, aber was ist mit der Benutzer-ID? Wie hoch ist die Wahrscheinlichkeit, dass ein Benutzer auf 3 oder 4 kleinen Websites mit mehr als 100 Benutzern und über 10 Websites mit 10.000 Benutzern auf 2 dieser Websites dieselbe Benutzer-ID hat? Ich sage nicht, dass es unmöglich ist, nur sehr unwahrscheinlich. Warum ist das überhaupt eine Voraussetzung? Wenn ein Hacker das Passwort eines Benutzers hat, versucht er dann nicht das vorhandene Passwort, bevor er sich die Mühe macht, es zu knacken, unabhängig davon, ob die Hashes übereinstimmen? Wenn die Passwörter unterschiedlich sind, haben sie sowieso unterschiedliche Hashes.
@MisterMelancholy Der Sinn eines global einzigartigen Salzes besteht darin, dass der Angreifer nicht vorher eine Regenbogentabelle erstellen kann.
Ich verweise Sie auf [So lagern Sie Salz?] (Http://security.stackexchange.com/questions/17421/how-to-store-salt/), um eine ausführliche Beschreibung zu erhalten, warum genau Salze erforderlich sind und welche Eigenschaften Sie brauchen.
@Polynomial Machen wir ein bisschen Selbststecker? : P.
@TerryChia Nur wo angebracht! ;)
Ok, ich glaube ich verstehe jetzt. Ein Salz soll eine Eindeutigkeit pro Hash bieten, aber es ist [selten verwendetes Gegenstück] (http://security.stackexchange.com/questions/41754/what-is-the-purpose-of-a-pepper/41757?noredirect) = 1 # 41757) liefert bei Bedarf einen zufälligen und unbekannten Faktor für einen Hash. Wenn Sie Ihre Antwort so bearbeiten, dass "Domain + Benutzer-ID" für ein lebensfähiges Salz ausreicht und die Verwendung eines Pfeffers bei Bedarf einen zufälligen und unbekannten Effekt liefert, akzeptiere ich dies als Antwort. Es tut uns auch leid, dass sich die Frage geändert hat, seit Sie Ihre Antwort veröffentlicht haben. es schien neben meiner Neugier gewachsen zu sein.
@MisterMelancholy Ich werde meine Antwort nicht so bearbeiten, dass sie dies einschließt, da ich nicht glaube, dass das Schema gut ist. Unvorhersehbar zu sein, ist keine harte Voraussetzung für ein Salz. Wenn es sich bei Ihrer Anwendung jedoch um eine Anwendung mit hohem Wert handelt, kann es sich für einen Angreifer lohnen, eine Regenbogentabelle für den Administrator oder einige Ziele mit hohem Wert zu erstellen. Die Verwendung von "Domain + Benutzer-ID" ist keine gute Idee, wenn Sie dies berücksichtigen, da die Administratorkonten eine hohe Tendenz haben, "Benutzer-ID = 0" oder "Benutzer-ID = 1" zu sein, wenn Sie inkrementierende Benutzer-IDs verwenden. Generieren Sie einfach ein zufälliges Salz, es ist der einfachste und am wenigsten schmerzhafte Weg.
@TerryChia Ich wusste nicht, dass Sie anderer Meinung sind, jetzt sieht es aus wie Bestechung. Ich respektiere, woher du kommst, weil ich deine Antwort für Repräsentanten nicht ändern will. Wie auch immer, zurück zum Thema. Was ist mit einem langen und zufälligen Pfeffer zusätzlich zu einem Salz? Wollen Sie damit einfach sagen, dass die Verwendung eines zufälligen Salzes einfacher ist? Ich möchte, dass eine akzeptierte Antwort eine Erklärung dazu abgibt, auch wenn die Antwort besagt, dass die Implementierung schwieriger wäre als ein zufälliges Salz. Obwohl ich meine Frage häufig aktualisiert habe, wurde immer gefragt, ob diese Methode so sicher und nicht unbedingt so einfach zu implementieren ist
@MisterMelancholy Ich habe in einigen Punkten hinzugefügt, die das Problem ansprechen.
@TerryChia Wie wäre es mit einem langen und zufälligen Pfeffer mit einem vorhersehbaren Salzschema? Ändert das nicht Ihre Sicht auf das Schema? Meine Frage wurde aktualisiert, um die Möglichkeit des Hinzufügens eines Pfeffers anzusprechen.
@MisterMelancholy Meine Antwort darauf lautet * Ich weiß es nicht sofort *. Es scheint alle Sorgen mit einem vorhersehbaren Salz zu lösen, aber es könnte subtilere Schwächen geben, an die ich nicht denken kann. Mein letzter Punkt bleibt jedoch bestehen: Zufällige Salze sind einfach und schnell zu erzeugen. Warum etwas anderes in der Praxis verwenden?
@TerryChia Ich stelle nur gerne Fragen. Und meine Theorie scheint eine gültige Theorie zu sein. Ich glaube nicht, dass ich hier kryptografisch (dis) bewiesen werde, also muss diese Antwort reichen. Vielen Dank für Ihre Zeit und Ihren erweiterten Input. Soweit ich meine Frage oft ändere, frage ich nach solchen Situationen und wie man sie vermeidet [hier auf der Meta] (http://meta.stackexchange.com/questions/195694/question- Bearbeiten oder Reformieren von Fragen), wenn Sie Eingaben machen möchten.
Wenn das Schema "Domäne + Benutzer-ID" korrekt implementiert ist, ist die Einheitlichkeit der Benutzer-ID über Datenbanken hinweg kein Problem: Der Angreifer kann keine Regenbogentabelle für z. Benutzer-ID = 1. Dies setzt natürlich voraus, dass * korrekt implementiert *. Wenn salt = domain || userid, ist das kaputt. Wenn salt = sha1 (domain || userid) ist, ist das in Ordnung. In jedem Fall sollte @MisterMelancholy nur eine Standardfunktion aufrufen und nicht versuchen, ein Rad neu zu erfinden und zwischen einem quadratischen und einem fünfeckigen Rad zu wackeln.
Ilmari Karonen
2013-09-01 19:11:14 UTC
view on stackexchange narkive permalink

Das wichtige Merkmal eines Passwortsalzes ( wie Terry Chia richtig bemerkt) ist, dass es global eindeutig sein sollte: Keine zwei Passwort-Hashes (auch nicht auf verschiedenen Websites) sollten jemals dasselbe Salz haben.

Die Verwendung eindeutiger Salze schützt vor verschiedenen verwandten Angriffsmethoden, die möglicherweise von einem Angreifer angewendet werden, der die Benutzerdatenbank kompromittiert hat und die Kennwörter aus seinen Hashes wiederherstellen möchte:

  • Erstens wird verhindert, dass ein Angreifer leicht erkennen kann, ob mehrere Benutzer dasselbe Kennwort haben (was diese Benutzer zu einem offensichtlichen Ziel machen würde, da ein solches gemeinsames Kennwort wahrscheinlich leicht zu erraten und eine hohe Auszahlung zu erzielen wäre).

  • Umgekehrt wird auch verhindert, dass ein Angreifer, der mehrere Websites kompromittiert hat, leicht erkennen kann, welche Benutzer auf beiden Websites dasselbe Kennwort verwendet haben.

  • Darüber hinaus verhindert die Verwendung eines eindeutigen Salt für jeden Benutzer, dass ein Angreifer einen Vorteil erhält, wenn er mehrere Konten gleichzeitig angreift. Ohne Salze (oder mit nicht eindeutigen Salzen) könnte ein Angreifer ein erratenes Passwort hashen und es dann mit jedem Passwort-Hash in der Datenbank vergleichen, wodurch es wahrscheinlicher wird, dass er mindestens eine Übereinstimmung erhält. Bei eindeutigen Salzen ist dies nicht möglich, da der Angreifer das Salz (und damit einen einzelnen Zielbenutzer) auswählen muss, bevor er jedes Passwort erraten kann.

  • Schließlich werden auch eindeutige Salze verwendet Es ist unpraktisch, vorberechnete Hash-Nachschlagetabellen (wie die sogenannten "Regenbogentabellen") zu verwenden, um das Knacken von Passwörtern zu beschleunigen, da im Wesentlichen für jeden Benutzer eine separate Tabelle erforderlich wäre.

Grundsätzlich besteht das Hauptziel des Salting darin, sicherzustellen, dass das Knacken mehrerer kompromittierter Passwort-Hashes nicht einfacher ist, als jedes einzelne einzeln zu knacken - nicht mehr und nicht weniger. Durch die Verwendung global einzigartiger Salze wird dieses Ziel erreicht.


Eine einfache Möglichkeit, die globale Eindeutigkeit (mit hoher Wahrscheinlichkeit) sicherzustellen, besteht darin, eine ausreichend lange zufällige Zeichenfolge als Salz zu verwenden. Es gibt jedoch auch andere Möglichkeiten.

Sie können beispielsweise ein global eindeutiges Salt erhalten, indem Sie eine lokal eindeutige Benutzerkennung (z. B. eine E-Mail-Adresse oder eine Kontonummer) mit einer festen, global eindeutigen ID kombinieren Site-ID (z. B. der Domain-Name einer Website) und möglicherweise einige andere Elemente wie ein Zweckbezeichner (falls Sie mehr als ein eindeutiges Salt pro Benutzer benötigen) und ein Zeitstempel (sodass ein neues Passwort immer ein anderes Salt erhält) ). Die folgende Zeichenfolge wäre beispielsweise für ein weltweit eindeutiges Salt perfekt geeignet:

"Dies ist ein Kennwort Salt für Benutzer 5457 auf security.stackexchange.com, das am 1. September 2013 um 13: 35: 23.94730 UTC erstellt wurde "

und dies auch:

" password_salt: 5457: security.stackexchange.com: 20130901T133523.94730 "

Wenn Sie möchten, dass Ihre Salze kompakter sind, können Sie auch eine der oben genannten Zeichenfolgen über eine kryptografische Hash-Funktion wie SHA-256 und Verwenden Sie die Ausgabe als Salz. Wenn Ihr System einen integrierten GUID -Generator bereitstellt, können Sie diesen einfach verwenden (vorausgesetzt, er funktioniert natürlich wie er sollte).


All das Es gibt jedoch einen potenziellen Vorteil, wenn Kennwortsalze nicht nur eindeutig, sondern auch unvorhersehbar sind: Sie verhindern, dass der Angreifer einen Brute-Force-Angriff startet, bevor er Ihre Datenbank kompromittiert hat .

Wenn ich als Angreifer wüsste, dass das Salz Ihres Administratorkontos beispielsweise "12345678" ist, könnte ich meine Computer so einstellen, dass sie eine Nachschlagetabelle mit mehr oder weniger gebräuchlichen Passwörtern erstellen, die mit diesem Salz gehasht wurden noch bevor ich einen Weg gefunden hatte, Ihren tatsächlichen Passwort-Hash zu erhalten . Sobald ich einen Weg gefunden hatte, dies zu tun (vielleicht Wochen oder Monate später), konnte ich den Hash in meiner Tabelle nachschlagen, in der Hoffnung, dass er mit einem der Passwörter übereinstimmt, die mein Programm in der Zwischenzeit bereits ausprobiert hatte, in diesem Fall ich würde das Passwort sofort kennen.

Wenn ich jedoch nicht einmal wüsste, welches Salz Sie tatsächlich verwendet haben, könnte ich das Passwort nicht erraten, bevor ich das richtige Salz zum ersten Mal erhalten habe. Dies würde zusätzliche Zeit in Anspruch nehmen und es Ihnen möglicherweise ermöglichen, das Passwort zu ändern, bevor ich es knacken konnte.

Auch hier sind lange zufällige Salze (mit hoher Wahrscheinlichkeit) nicht nur eindeutig, sondern auch unvorhersehbar. Es gibt jedoch auch andere Möglichkeiten, um dieses Ziel zu erreichen. Sie können beispielsweise eines der oben gezeigten eindeutigen Beispielsalze verwenden und einfach einen geheimen Wert (z. B. eine zufällige Zeichenfolge, die in einer Konfigurationsdatei gespeichert ist und möglicherweise regelmäßig geändert wird) anhängen. Da dieses Geheimnis für alle Benutzer gleich wäre, würde es nicht bei der Einzigartigkeit helfen, aber es würde sicherstellen, dass ich keinen Brute-Force-Angriff starten könnte, ohne vorher irgendwie das Geheimnis zu lernen.

Nachtrag: In Bezug auf Ihre Änderungen an der Frage würde ich sagen, dass Ihr Schema (unter Verwendung von Domainname + Benutzer-ID + Pfeffer als Salz) ausreichen sollte. Wenn möglich, würde ich auch einen Zeitstempel einfügen, aber dazu müssen Sie den Zeitstempel natürlich irgendwo speichern.

Trotzdem finde ich immer noch Ihre Prämisse ("das Salz ist nicht in der Datenbank gespeichert") a etwas rätselhaft. Wenn Sie den Passwort-Hash selbst in der Datenbank speichern können, warum nicht auch das Salz?

Tatsächlich verwenden viele gängige Kennwort-Hashing-Schemata überhaupt keine separate Datenbankspalte für das Salt, sondern speichern es nur als Teil der Hash-Zeichenfolge, z. Als -Methode $ salt $ hash , wobei die -Methode die verwendete Hashing-Methode identifiziert, sind salt und hash das Salt und Hash-Werte, die mit einem geeigneten Schema (z. B. base64) codiert wurden, und $ sind nur ein beliebiges Trennzeichen, das im codierten Salt oder Hash nicht vorkommt.

Ich frage nicht nach der Verwendung eines bekannten Salzes (wie Domainname + Benutzer-ID), sondern nach der Verwendung von Salzen, die benutzerdefinierte Werte enthalten, die Sie nicht sehen können, ohne sich zuerst beim Konto anzumelden (wie E-Mail) oder Benutzerkennwort selbst). Dies verhindert vorberechnete Regenbogentabellen für bestimmte Benutzer und verhindert, dass ich ein "Salz" -Feld in einer Datenbanktabelle habe. Wäre das nicht vorteilhaft, weil ein Hacker nicht sofort Hashing durchführen könnte, wenn die Datenbank kompromittiert würde?
Die Verwendung des Passworts als (Teil) des Salzes hilft nichts. Denken Sie ein bisschen darüber nach und Sie werden sehen warum. (Hinweis: Wie wird das Salt beim Passwort-Hashing verwendet?) Die Verwendung eines benutzerdefinierten Werts, den der Angreifer nicht erraten kann, könnte zwar dazu beitragen, das Salt unvorhersehbar zu machen, aber Dinge wie E-Mail-Adressen sind oft recht einfach zu erraten - die Leute neigen dazu um sie im ganzen Web zu veröffentlichen. Sie sollten das Salt wirklich nur in der Datenbank speichern, entweder in einer separaten Spalte oder (wie üblich) nur vor dem Passwort-Hash.
Die Verwendung eines Passworts als Teil eines Salzes erscheint mir vollkommen sinnvoll: Es wäre "Passwort + Passwort". Alleine wäre es ein schlechtes Salz, weil es nicht eindeutig ist, aber wenn man so etwas wie "Benutzer-ID + - + Passwort + Passwort" macht, wäre es eindeutig und nicht erkennbar, richtig? Beachten Sie, dass der Bindestrich in Fällen benötigt wird, in denen Benutzer-ID 1 das Kennwort 23 und Benutzer-ID 12 das Kennwort 3 verwendet.
@MisterMelancholy: Warum hat ein Angreifer Ihrer Meinung nach größere Schwierigkeiten beim Erstellen einer Nachschlagetabelle für "Benutzer-ID + Kennwort + Kennwort" als nur für "Benutzer-ID + Kennwort" (mit oder ohne Trennzeichen)?
@MisterMelancholy - Das Verdoppeln des Passworts würde überhaupt nichts helfen, dies wäre nur ein weiterer Hash-Algorithmus. Es würde nicht einmal ein serverseitiges Geheimnis (der Algorithmus) hinzufügen, da das Salz normalerweise im Klartext gespeichert wird. Sie können dann 1 Regenbogentabelle erstellen, um alle Kennwörter Ihrer Datenbank wiederherzustellen.
@IlmariKaronen Warum sollte ein Angreifer mehr Schwierigkeiten haben, eine Nachschlagetabelle für "salt + password" zu erstellen? Liegt es daran, dass Salz ein gewisses Maß an Entropie aufweist? Was ist mit einem sha-256 mit "Benutzer-ID + - + Passwort"? Und der Sinn des Begrenzers ist es, die Einzigartigkeit sicherzustellen.
@martinstoeckli Nun, der Vorteil dieser Frage besteht darin, dass das Salz nicht im Klartext in der Datenbank gespeichert wird. Es gibt Hashing-Funktionen, die das Salz nicht im Klartext hinzufügen. Außerdem könnte ein Hacker eine Regenbogentabelle für alle Phrasen mit 150 Zeichen erstellen, die lang genug wäre, um die meisten Salze und Passwörter zusammen zu enthalten. Der einzige Grund, warum sie das nicht tun, ist, dass das ein riesiger Tisch wäre. Das Salz ist nur ein eindeutiges Präfix vor dem Hashing, so dass der Hash anders ist, nicht wahr?
Ich habe meine Frage mehrmals aktualisiert (und bin fertig), und obwohl sie das gleiche Grundprinzip enthält, bitte ich jetzt jede Person mit einer Antwort, eine Überarbeitung ihrer Antwort in Betracht zu ziehen, um sicherzustellen, dass sie immer noch zum Thema gehört Frage. Entschuldigen Sie meine Unentschlossenheit und vielen Dank für Ihre Zeit und Ihren Beitrag.
martinstoeckli
2013-09-01 15:51:22 UTC
view on stackexchange narkive permalink

Ein Salz soll einzigartig sein, muss lang genug sein und sollte unvorhersehbar sein. Zufälligkeit ist nicht erforderlich, aber es ist der einfachste Weg für einen Computer, diese Anforderungen zu erfüllen. Und es ist nicht der Zweck eines Salzes, geheim zu sein, ein Salz erfüllt seinen Zweck auch dann, wenn es bekannt ist.

Einzigartigkeit bedeutet, dass es nicht nur in Ihrer Datenbank eindeutig sein sollte (andernfalls) Sie könnten eine Benutzer-ID verwenden), sie sollte weltweit einzigartig sein. Jemand könnte Regenbogentabellen für Salze wie z. 1-1000 und können Kennwörter für alle Konten mit diesen Benutzer-IDs abrufen (häufig haben Administratorkonten niedrige Benutzer-IDs).

Lang genug : Wenn das Salz zu kurz ist (auch) wenige mögliche Kombinationen), es wird wieder rentabel, Regenbogentabellen zu bauen. Salt und Passwort zusammen können dann nur als ein längeres Passwort angesehen werden. Wenn Sie eine Regenbogentabelle für diese längeren Passwörter erstellen können, erhalten Sie auch die kürzeren ursprünglichen Passwörter. Bei sehr starken und langen Passwörtern wäre das Salzen eigentlich überhaupt nicht erforderlich, aber die meisten von Menschen generierten Passwörter können brutal erzwungen werden, weil sie kurz sind (die Leute müssen sich an sie erinnern) Andere Parameter können in diese Kategorie fallen. Nur weil Sie einen Hash aus der Benutzer-ID berechnen, erhöht dies nicht die möglichen Kombinationen.

Unvorhersehbarkeit ist etwas weniger wichtig, aber stellen Sie sich noch einmal den Fall vor, in dem Sie die verwenden Benutzer-ID als Salz, ein Angreifer kann herausfinden, wie die nächsten Benutzer-IDs aussehen werden, und kann daher eine begrenzte Anzahl von Regenbogentabellen vorberechnen. Abhängig vom verwendeten Hash-Algorithmus kann dies zutreffen oder nicht. Er hat dann einen Zeitvorteil, kann das Passwort sofort abrufen. Ein größeres Problem wird sein, wenn die Administratorkonten ein vorhersehbares Salz verwendet haben.

Die Verwendung einer wirklich zufälligen Zahl, die aus der Zufallsquelle des Betriebssystems (dev / urandom) generiert wurde, ist das Beste, was Sie tun können. Selbst wenn Sie alle oben genannten Gründe ignorieren, warum sollten Sie ein abgeleitetes Salz verwenden, wenn es einen besseren Weg gibt, warum nicht den besten Weg verwenden, den Sie kennen?

UPDATE: , um die Frage zu beantworten Geänderte Frage:

Es ist sicherlich keine gute Idee, nur Domänenname + Benutzer-ID zum Generieren des Salt zu verwenden, da dies erraten werden kann und vorhersehbar ist. Ein Pfeffer hilft hier nicht weiter, da er so konstant ist wie der Domänenname. Sie sollten sich nicht darauf verlassen, dass er geheim ist. Mit der Benutzer-ID erhalten Sie Eindeutigkeit, mit dem Domänennamen erhalten Sie globale Eindeutigkeit, aber Sie vermissen den unvorhersehbaren Teil.

In Ihrem vorherigen Beispiel haben Sie das Kennwort selbst als zufälligen Parameter wie salt = hash ( Domänenname + Benutzer-ID + Kennwort) . Dies könnte funktionieren, solange das Salz überhaupt nicht gespeichert wird. Um das Passwort zu überprüfen, verfügen Sie über alle erforderlichen Parameter. Ich kann keinen Fehler in diesem Konzept erkennen, aber das bedeutet nicht, dass ich es empfehle. Wie bereits erwähnt, können Sie nichts Besseres tun, als ein zufälliges unabhängiges Salz zu erzeugen. Das Hinzufügen dieses Salzes zum Hash und das Extrahieren zur Überprüfung ist keine schwierige Aufgabe. Die am besten geeigneten Hash-Funktionen erledigen dies bereits für Sie, da sie den Kostenfaktor auf die gleiche Weise speichern müssen.

Technisch gesehen spielt ihre Länge keine Rolle, solange jedes Salz global einzigartig ist. (Und umgekehrt hilft es nicht, Ihre Salze nur länger zu machen, wenn sie nicht einzigartig sind.) Das Salzen hilft nicht wirklich gegen Brute-Force-Angriffe gegen einen einzelnen Benutzer (wie der mittlere Teil Ihrer Antwort zu vermuten scheint ); Dafür möchten Sie [Key Stretching] (http://en.wikipedia.org/wiki/Key_stretching).
@IlmariKaronen - Ich habe gerade etwas klarer geschrieben, was ich meinte (über den Mittelteil), wahrscheinlich haben Sie die Bearbeitung nicht bemerkt. Und natürlich ist das Strecken von Schlüsseln heute ein Muss.
Das Salting mit der Benutzer-ID wäre für eine einzelne Datenbank eindeutig. Die Wahrscheinlichkeit, dass derselbe Benutzer auf 2 (oder 3 oder 4) Websites dieselbe ID hat, ist wahrscheinlich sehr gering. Wenn ein Hacker eine Regenbogentabelle mit den IDs 1-1000 vorberechnet, ist der Hash anfällig, da Sie ein vorhersehbares Salz verwendet haben. Deshalb habe ich in meiner Frage angegeben, dass das Salzen mit der Benutzer-ID allein keine gute Idee ist.
@MisterMelancholy - Es spielt keine Rolle, ob ein Benutzer auf einer anderen Site dieselbe ID hat. Eine Regenbogentabelle mit diesen Salzen würde "alle" Passwörter mit allen ausgewählten Salzen enthalten und somit für jede Site funktionieren. In Bezug auf die E-Mail können Sie nicht davon ausgehen, dass die E-Mails vor der Öffentlichkeit verborgen sind, Hashes erstellt werden oder wenn die Datenbank bereits gestohlen wurde, sodass auch die E-Mail-Adressen bekannt sind. Die Verwendung der E-Mail als Salt, möglicherweise kombiniert mit anderen Daten und Hash, ist nicht das Schlimmste, was Sie tun können, aber die Verwendung eines zufälligen unabhängigen Salt ist immer besser.
@MisterMelancholy - Sie haben es bereits gut beantwortet. Der Hash wird verwendet, um das Abrufen des ursprünglichen Kennworts zu verhindern. Wenn Sie das Kennwort also als Salt in abrufbarer Form speichern, wird der gesamte Aufwand rückgängig gemacht (Sie benötigen es zur Überprüfung). Wenn Sie ein serverseitiges Geheimnis hinzufügen möchten, ist es eine gute Methode, den Kennwort-Hash mit einem serverseitigen Schlüssel zu verschlüsseln oder einen Pfeffer zu verwenden. Aber verwechseln Sie nicht die beiden, lassen Sie das Salz bekannt werden (Klartext) und der serverseitige Schlüssel ein Geheimnis sein.
Entschuldigung, ich habe meinen Kommentar entfernt, weil ich bei der Antwort von ilmari Karonen im Grunde dasselbe gefragt habe und Sie darauf geantwortet haben. Bei dieser Frage geht es auch darum, die Notwendigkeit zu vermeiden, das Salz im Klartext in der Datenbank zu speichern. Es gibt Funktionen zum Hashing von Passwörtern, mit denen das Salt nicht an das Passwort angehängt wird. Ich weiß, dass es ein getrenntes Salz und Pfeffer gibt, aber was ist falsch daran, dass beide, wenn möglich, dasselbe sind? @martinstoeckli
@MisterMelancholy - Ok, ich verstehe jetzt, Sie möchten das Salz überhaupt nicht speichern und möchten das Salz daher vollständig von anderen Parametern ableiten. Es gibt jedoch ein Problem, das es unmöglich macht, die Parameter danach zu ändern. Wenn der Benutzer die E-Mail aktualisieren möchte und Sie sie als Salt verwendet haben, können Sie den Kennwort-Hash nicht mit der neuen E-Mail neu berechnen, da Sie das ursprüngliche Kennwort dann nicht kennen. Sie müssten auch die alte E-Mail speichern, was es nicht besser macht, als ein Salz zu speichern.
Ja. Ich sollte das wahrscheinlich in meine Frage aufnehmen, damit es klarer wird - entschuldigen Sie die Verwirrung. Und das ist einfach; Wenn ein Benutzer seine E-Mail-Adresse ändern möchte, muss das Kennwort erneut gehasht werden, da das Salt unterschiedlich ist, und beide Felder gleichzeitig aktualisiert werden. Wenn eine Datenbank kompromittiert wird, ändern Benutzer, die ihre Kennwörter ändern, auch das Salt, wodurch eine potenziell gehashte Version des Kennworts geändert wird, die Entropie bietet, da der ursprüngliche Wert unbekannt ist, wodurch ein neues und zufälliges Salt erstellt wird.
@MisterMelancholy - Sie können das Passwort beim Aktualisieren der E-Mail-Adresse nicht erneut verarbeiten. Um den neuen Passwort-Hash zu erstellen, benötigen Sie die E-Mail und das ursprüngliche Passwort, aber in diesem Moment kennen Sie nur die E-Mail und den _hash_ des ursprünglichen Passworts.
Lassen Sie sie dann ihr Passwort eingeben, um dieses Feld zu ändern? Trotzdem ist es wahrscheinlich eine schlechte Idee, alles zu verwenden, was der Benutzer als Teil des Salzes ändern kann. IDs ändern sich jedoch nie, und wenn sich das Kennwort ändert, ändert sich auch das Kennwort. Ich werde meine Frage aktualisieren und sie etwas detaillierter gestalten, was für das relevant ist, was wir hier diskutieren.
@martinstoeckli Meine Frage wurde aktualisiert. Und danke für die bisherige Diskussion.
Ich habe meine Frage mehrmals aktualisiert (und bin fertig), und obwohl sie das gleiche Grundprinzip enthält, bitte ich jetzt jede Person mit einer Antwort, eine Überarbeitung ihrer Antwort in Betracht zu ziehen, um sicherzustellen, dass sie immer noch zum Thema gehört Frage. Entschuldigen Sie meine Unentschlossenheit und vielen Dank für Ihre Zeit und Ihren Beitrag.
@MisterMelancholy - Ich habe meine Antwort entsprechend aktualisiert.
Gilles 'SO- stop being evil'
2013-09-04 13:02:09 UTC
view on stackexchange narkive permalink

Zunächst einmal möchte ich vermeiden, das Salz in der Datenbank als einfachen Text zu speichern.

Warum? Es gibt keinen guten Grund, das Speichern des Salzes in der Datenbank im Klartext zu vermeiden. So wird ein Salz normalerweise gespeichert.

Mit den verschiedenen Iterationen Ihrer Frage haben Sie verschiedene Möglichkeiten vorgeschlagen, um Dinge anders zu machen, aber alle haben entweder die gleichen Sicherheitseigenschaften oder (normalerweise) ) machen die Sache noch schlimmer.

Der Sinn eines Salzes besteht darin, zu verhindern, dass Angreifer die Arbeit teilen, wenn sie viele Konten gleichzeitig knacken. Oft sind Angreifer nicht hinter einem bestimmten Benutzer auf einer bestimmten Site her. Sie möchten Fuß fassen oder so viele Konten wie möglich knacken. Der springende Punkt ist, dass das Knacken von Joes Konto auf der ACME-Site völlig andere Berechnungen erfordert als das Knacken von Janes Konto oder Joes Konto auf der Yoyodyne-Site. Daher muss ein Salt global eindeutig sein: über Konten und Datenbanken (und sogar über die Zeit hinweg).

Wenn Sie das Kennwort als Teil der Salt-Berechnung verwenden, ist es kein Salt at alles. Das Salz muss unabhängig vom Passwort sein. Wenn Sie das Salz aus dem Passwort berechnen, wird es Teil der Hash-Funktion: H (S (P), P) ist eine Funktion von P, Sie haben nur eine neue Hash-Funktion erstellt H '(P) = H ( S (P), P).

Die Verwendung des Benutzernamens ist nicht gut, da er in allen Datenbanken gleich sein kann. Ein Angreifer mit der ACME-Datenbank und der Yoyodyne-Datenbank kann beide Datenbanken knacken, ohne den Aufwand zu verdoppeln, wenn er Salz verwendet, das vom Benutzernamen abgeleitet ist.

Wenn Sie den Domänennamen und die Benutzer-ID verwenden, kann dies möglich sein Arbeit. Stellen Sie sicher, dass niemand auf der Welt denselben Domainnamen verwendet. Verwenden Sie insbesondere nicht denselben Domainnamen, wenn Sie mehr als eine Unterwebsite haben: Geben Sie den Dienstnamen oder was auch immer erforderlich ist, um den Namen eindeutig zu machen. Verwenden Sie Benutzer-IDs auch nicht wieder. Solange Ihr Salz weltweit einzigartig ist, ist es ein richtiges Salz.

Beachten Sie jedoch, dass Sie keine Sicherheit erhalten , wenn Sie den Domainnamen und die Benutzer-ID als Salt verwenden, anstatt wie üblich ein zufälliges Salt. Das Salz wird immer noch effektiv in der Datenbank gespeichert, nur auf seltsame Weise. Sie speichern einige Bytes pro Datenbankeintrag, was nicht von Bedeutung sein sollte.

Ein Pfeffer verbessert auch die Sicherheit nicht wesentlich. Sie können nicht davon ausgehen, dass Ihr Pfeffer geheim bleibt. Wenn der Angreifer eine Kopie Ihrer Kennwortdatenbank erhalten konnte (normalerweise durch Gefährdung Ihrer Anwendung oder durch Zugriff auf ein Backup), hat er wahrscheinlich auch Zugriff auf den Pfeffer (er muss für die Anwendung zugänglich und gesichert sein) immerhin auf). Der einzige Fall, in dem ein Pfeffer nützlich ist, ist ein Kompromiss wie SQL Injection, der dem Angreifer nur Zugriff auf die Datenbank gewährt und sich nicht auf einen Anwendungskompromiss erstreckt, auch nicht über ein Administratorkonto. Rechnen Sie nicht damit. Auch wenn Sie einen Pfeffer verwenden, muss Ihr Salz global eindeutig sein .

Ich empfehle dringend, ein zufälliges Salz zu generieren und neben dem Passwort zu speichern. Codieren Sie es vorzugsweise nicht selbst: Verwenden Sie eine vorhandene Bibliothek, die es richtig macht . Je mehr Sie von der empfohlenen Vorgehensweise abweichen, desto mehr riskieren Sie, es falsch zu machen - möglicherweise völlig, gefährlich falsch, wie das Ableiten des Salzes aus dem Passwort.

Denken Sie daran, dass Passwort-Hashes nicht nur gesalzen, sondern auch langsam sein müssen. Das bedeutet PBKDF2 oder bcrypt oder scrypt, wobei die Iterationszahl an die aktuellen Computergeschwindigkeiten angepasst ist.

Weitere Hintergrundinformationen finden Sie in unseren zahlreichen Threads zu diesem Thema:

"Sie erhalten keine Sicherheit, wenn Sie den Domainnamen und die Benutzer-ID als Salt verwenden". Ist es nicht der Sinn des Salzes, "zu verhindern, dass Angreifer die Arbeit teilen, wenn sie viele Konten gleichzeitig knacken"? Das Salz allein soll die Sicherheit nicht erhöhen. Es ist so, dass ein Hacker seine Arbeit nicht für einen Hash auf einem anderen wiederverwenden kann. Und "Sie können nicht davon ausgehen, dass Ihr Pfeffer geheim bleibt." Ich finde dieses Argument eine Art Streitpunkt. Wenn ein Hacker Serverzugriff erhält und Ihre Passwort-Hashing-Funktion findet, sind Sie dann nicht gleichermaßen verrückt, ob Sie bcrypt oder etwas anderes verwenden? mit oder ohne Pfeffer?
@MisterMelancholy meinte ich im Vergleich zu einem zufälligen Salz, nicht im Vergleich zu überhaupt keinem Salz. Domain Name + User ID ist ungefähr so ​​sicher wie ein zufälliges Salt, wenn Sie es richtig machen (hat aber keinen Vorteil). Der Angreifer kann den Anwendungscode abrufen, ohne Zugriff zu erhalten (z. B. von einer kompromittierten Sicherung). Dies ist ein recht häufiges Szenario, vor dem Sie schützen sollten. Darüber hinaus sollten Sie die Kennwörter selbst schützen, auch wenn der Angreifer Zugriff auf die Konten erhält, da die Kennwörter möglicherweise an anderer Stelle wiederverwendet werden.
Ich denke, es hat einen Vorteil; Dies bedeutet ein Feld weniger in meiner Datenbank sowie kein bestimmtes "Salz" -Feld. Ohne Quellcode ist der Hacker noch mehr verloren als mit einem Salzfeld. "Der Angreifer kann den Anwendungscode abrufen, ohne Zugriff zu erhalten (z. B. von einem kompromittierten Backup)." Ist dies nicht genauso wahrscheinlich, dass die Kennwort-Hashing-Funktion ausgeführt wird wie der Pfeffer?
@MisterMelancholy Das Salz wird normalerweise zusammen mit dem Hash gespeichert. Dies ist Standard, aber Sie können ein separates Salzfeld haben (und eine Iterationszahl oder einen analogen Arbeitsfaktorwert, der ebenfalls gespeichert werden muss). Die Passwort-Hashing-Funktion muss nicht geheim sein. Gehen Sie niemals davon aus, dass der Hacker nicht über den Quellcode verfügt: Wenn Ihre Sicherheit davon abhängt, haben Sie bereits verloren. Dies ist ein [bekanntes Sicherheitsprinzip] (http://en.wikipedia.org/wiki/Kerckhoffs%27_principle).
@MisterMelancholy - Sie verwenden einen langsamen Hash wie BCrypt und einen Pfeffer, genau für den Fall, dass ein Hacker Zugriff auf Ihre Datenbank oder Ihren Server erhält. Wenn die Hash-Funktion langsam ist, kann ein Angreifer z. nur 1 Hash anstelle von [8 Giga] (http://hashcat.net/oclhashcat-lite/#performance) Hashes. Für den Pfeffer muss der Angreifer über Berechtigungen auf dem Server verfügen. Dies ist schwieriger als nur Lesezugriff auf die Datenbank.
demize
2013-09-02 01:29:27 UTC
view on stackexchange narkive permalink

Da keine der anderen Antworten dies zu berühren scheint:

Verwenden Sie KEINEN Teil des Passworts als Salz. Zusätzlich zur Verringerung der Unvorhersehbarkeit hilft es einem Angreifer, die Passwörter zu knacken, wenn ein Angreifer es herausfindet. Warum? Weil sie genau dort einen Teil davon neben dem Kennwort in der Datenbank haben.

Update: Wenn Sie einen Teil des Kennworts im Salt verwenden und dies vermeiden möchten Das Salz speichern zu müssen und dann einen Teil des Passworts zu ziehen, nachdem es eingegeben wurde, um das Salz zu berechnen, funktioniert gut. Es erschwert das brutale Forcen weiter und ist bei der Erhöhung der Entropie genauso wirksam wie ein normales Salz. Es macht es etwas schwieriger, Regenbogentabellen zu erstellen, da Sie das Salz pro Passwort berechnen müssen, aber es verhindert sie nicht wirklich besser als ein normales Salz.

"Zuallererst ist es mein Motiv, das Speichern des Salzes in der Datenbank als Klartext zu vermeiden. Ich möchte vermeiden, dass" das schlecht ist, weil das Salz im Klartext gespeichert ist ".
@MisterMelancholy Dies ist jedoch der wichtigste Punkt. Wenn Sie das Salz nicht speichern, wird es Teil der Hash-Funktion und ist somit überhaupt kein Salz. Wenn Sie das Salz aufbewahren, müssen Sie es schützen, da es den Hash enthält - und Sie benötigen eine Möglichkeit, das Salz wiederzugewinnen, das von einem Angreifer gleichermaßen verwendet werden kann.
Der für das Salt generierte Hash wird jedoch nicht in der Datenbank gespeichert. Das ist der springende Punkt dieser Frage. Es wird nur ein Hash in der Datenbank gespeichert. Die einzige Möglichkeit, den Hash für Ihr Salt zu finden, besteht darin, den ursprünglichen Passwort-Hash zu knacken. Daher ist es irrelevant, dass der Salt-Hash das Passwort enthält, da sie das Passwort haben, wenn sie den Hash erhalten. Der Salz-Hash wird im laufenden Betrieb generiert, unabhängig von der Serversprache, und sollte nur für die Entropie und Länge Ihres Salzes verwendet werden. @demize
Es wird nicht gespeichert. Die zuverlässige Möglichkeit, es neu zu generieren, besteht darin, das Passwort zu verwenden, das zuerst gehasht wird. Der einzige Grund, warum ich jemals gehört habe, dass "ein Salz nicht geschützt werden muss", sind dumme Richtlinien, denen ich nicht zustimme (daher diese Frage). Ein Salz ist nur ein recycelbarer und einzigartiger Pfeffer, was dumm ist, weil diese Methode jeden möglichen Zweck eines Salzes und eines Pfeffers in Kombination erfüllen könnte, wenn es als Salz und Pfeffer kombiniert behandelt wird. Es ist auch wahr, dass dies einen anderen Angriffsvektor öffnet. Sie müssen jedoch den ersten Angriffsvektor übergeben, um dorthin zu gelangen. @demize
@demize - Nun, das ist die eigentliche Frage, führt es wirklich einen neuen Angriffsvektor ein und wie? Die Benutzer-ID würde das Salt eindeutig machen, der Domainname würde es global eindeutig machen und das Passwort würde es unvorhersehbar machen. Es ist möglich, es neu zu generieren, und wenn sich das Kennwort ändert, führt dies zu einem anderen Salz.
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/10420/discussion-between-curiousguy-and-demize)
Ich habe meine Frage mehrmals aktualisiert (und bin fertig), und obwohl sie das gleiche Grundprinzip enthält, bitte ich jetzt jede Person mit einer Antwort, eine Überarbeitung ihrer Antwort in Betracht zu ziehen, um sicherzustellen, dass sie immer noch zum Thema gehört Frage. Entschuldigen Sie meine Unentschlossenheit und vielen Dank für Ihre Zeit und Ihren Beitrag.
Jeffrey Goldberg
2013-09-04 09:43:02 UTC
view on stackexchange narkive permalink

Neben der hervorragenden Antwort von @ terry-chia gibt es noch einen weiteren Grund, zufällige Salze zu wählen. Das Hashing- und Authentifizierungsschema, das Sie heute verwenden, stellt möglicherweise relativ schwache Anforderungen an das Salzen, aber eines Tages (oder eines Nachfolgers) können Sie das verwendete Schema möglicherweise so ändern, dass eine Zufallsanforderung besteht.

Obwohl Zufälligkeit keine Voraussetzung ist, sind Sie weitaus sicherer, wenn Sie zufällige Salze auswählen, da dies garantiert, dass Sie alle für Ihr Schema heute erforderlichen Dinge erhalten, aber es bietet Ihnen auch was Sie morgen vielleicht brauchen.

Wieder ein zusätzlicher Grund zu dem, was andere bereits erklärt haben. Leiten Sie das Salz nicht aus Benutzerdaten ab! Wenn Sie ein zufälliges Salz verwenden, erhalten Sie möglicherweise mehr als Sie benötigen, aber es stellt sicher, dass Sie keine anderen Fehler machen. Sie haben nichts zu gewinnen, wenn Sie kein zufälliges Salz verwenden (es sei denn, es gibt etwas, das Sie noch nicht erklärt haben), während Sie Ihr System weitaus weniger robust machen, indem Sie sich nur für die Mindestanforderungen eines Salzes entscheiden.

Ich habe meine Frage mehrmals aktualisiert (und bin fertig), und obwohl sie das gleiche Grundprinzip enthält, bitte ich jetzt jede Person mit einer Antwort, eine Überarbeitung ihrer Antwort in Betracht zu ziehen, um sicherzustellen, dass sie immer noch zum Thema gehört Frage. Entschuldigen Sie meine Unentschlossenheit und vielen Dank für Ihre Zeit und Ihren Beitrag.


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...