2008-10-17 11 views
91

Bei der Arbeit haben wir zwei konkurrierende Theorien für Salze. Die Produkte, an denen ich arbeite, verwenden einen Benutzernamen oder eine Telefonnummer, um den Hashwert zu salzen. Im Wesentlichen etwas, das für jeden Benutzer anders ist, aber für uns leicht verfügbar ist. Das andere Produkt generiert nach dem Zufallsprinzip für jeden Benutzer ein Salz und ändert es jedes Mal, wenn der Benutzer das Kennwort ändert. Das Salz wird dann in der Datenbank verschlüsselt.Die Notwendigkeit, das Salz für einen Hash zu verstecken

Meine Frage ist, ob der zweite Ansatz wirklich notwendig ist? Ich kann aus einer rein theoretischen Perspektive verstehen, dass es sicherer ist als der erste Ansatz, aber was ist aus praktischer Sicht. Um jetzt einen Benutzer zu authentifizieren, muss das Salz unverschlüsselt und auf die Anmeldeinformationen angewendet werden.

Nachdem ich darüber nachgedacht habe, sehe ich keinen wirklichen Sicherheitsgewinn von diesem Ansatz. Das Ändern des Salt von Konto zu Konto macht es immer noch extrem schwierig für jemanden, den Hashalgorithmus brutal zu erzwingen, auch wenn der Angreifer wusste, wie schnell er für jedes Konto ermitteln konnte. Dies geht davon aus, dass die Passwörter ausreichend stark sind. (Offensichtlich ist das Finden des korrekten Hash für eine Gruppe von Passwörtern, wo sie alle zwei Ziffern sind, wesentlich einfacher als das Finden des korrekten Hashs von Passwörtern, die 8 Ziffern sind). Bin ich falsch in meiner Logik oder gibt es etwas, das ich vermisse?

EDIT: Okay, also hier ist der Grund, warum ich denke, es ist wirklich strittig, das Salz zu verschlüsseln. (Ich weiß, ob ich auf dem richtigen Weg bin).

Für die folgende Erklärung gehen wir davon aus, dass die Passwörter immer 8 Zeichen lang sind und das Salt 5 ist und alle Passwörter aus Kleinbuchstaben bestehen (das erleichtert die Mathematik einfach).

Mit einem anderen Salz für jeden Eintrag bedeutet, dass ich nicht die gleiche Rainbow-Tabelle verwenden kann (eigentlich könnte ich technisch, wenn ich eine ausreichende Größe hätte, aber ignorieren wir das im Moment). Dies ist der wahre Schlüssel zum Salz von dem, was ich verstehe, denn um jeden Bericht zu knacken, muss ich das Rad sozusagen für jeden neu erfinden. Wenn ich nun weiß, wie man das richtige Salz auf ein Passwort anwendet, um den Hash zu erzeugen, würde ich es tun, weil ein Salz wirklich nur die Länge/Komplexität der Hash-Phrase verlängert. Also würde ich die Anzahl der möglichen Kombinationen reduzieren, die ich erzeugen müsste, um "wissen" zu können, dass ich das Passwort + Salz von 13^26 bis 8^26 habe, weil ich weiß, was das Salz ist. Nun, das macht es einfacher, aber immer noch sehr schwer.

Also auf die Verschlüsselung des Salzes. Wenn ich weiß, dass das Salz verschlüsselt ist, würde ich es zuerst nicht versuchen und entschlüsseln (vorausgesetzt, ich weiß, dass es ein ausreichendes Maß an Verschlüsselung hat). Ich würde es ignorieren. Anstatt zu versuchen, herauszufinden, wie man es entschlüsseln kann, gehe ich zum vorherigen Beispiel zurück und erzeuge einfach eine größere Rainbow-Tabelle, die alle Schlüssel für das 13^26 enthält. Das Salz nicht zu kennen würde mich definitiv bremsen, aber ich denke nicht, dass es die monumentale Aufgabe, die Salzverschlüsselung zuerst zu knacken, hinzufügen würde. Deshalb denke ich nicht, dass es das wert ist. Gedanken?

Hier ist ein Link zu beschreiben, wie lange Passwörter unter einem Brute-Force-Angriff halten werden: http://www.lockdown.co.uk/?pg=combi

+0

Gute Frage, Kevin, sehr aktuell. Ich kann nichts zur Sicherheit sagen, aber es gibt einen Performance-Erfolg für all diese Verschlüsselung und Entschlüsselung, sicher. – DOK

+0

Sie müssen die Rainbow-Tabelle der anständigen Größe nicht ignorieren - diese Tabelle macht auch die verschlüsselte Meldung salzig, da sie den gesalzenen Hash entschlüsseln kann und erneut verwendet werden kann, um den ursprünglichen Hash zu entschlüsseln. Die gute Nachricht ist, dass der Tisch wahrscheinlich Jahrhunderte brauchen würde. – tloach

+0

Die Sache, die mich erwischt, ist, dass ich nicht ganz sicher bin, dass ein Regenbogen-Tisch dieser Größe so lange braucht, um ihn zu erschaffen. Er ist eine verrückte Idee, nehmen Sie eine verteilte Rechnerplattform wie Kraken (es ist wirklich so, wie es ist), um es zu erzeugen. Wie lange würde es dann dauern? – kemiller2002

Antwort

38

Die Antwort hier ist, sich zu fragen, vor was Sie wirklich schützen möchten? Wenn jemand Zugriff auf Ihre Datenbank hat, hat er Zugriff auf die verschlüsselten Salze und hat wahrscheinlich auch Zugriff auf Ihren Code. Mit all dem konnten sie die verschlüsselten Salze entschlüsseln? Wenn ja, dann ist die Verschlüsselung sowieso ziemlich nutzlos. Das Salz ist wirklich da, um es so zu machen, dass es nicht möglich ist, einen Regenbogen-Tisch zu bilden, um Ihre gesamte Passwort-Datenbank in einem Rutsch zu knacken, wenn sie kaputt geht. Von diesem Standpunkt aus, solange jedes Salz einzigartig ist, gibt es keinen Unterschied, ein Brute-Force-Angriff wäre mit Ihren Salzen oder den verschlüsselten Salzen für jedes Passwort einzeln erforderlich.

+0

Alle Ressourcen auf einem Regenbogen-Tisch? – Thomas

3

Mein Verständnis von „Salz“ ist, dass es erschwert Knacken, aber es nicht versucht, das zu verbergen zusätzliche Daten Wenn Sie versuchen, mehr Sicherheit zu erhalten, indem Sie das Salt "geheim" machen, dann wollen Sie wirklich nur mehr Bits in Ihren Verschlüsselungsschlüsseln.

1

Es gibt zwei Techniken, mit unterschiedlichen Zielen:

  • Das „Salz“ verwendet wird, um zwei ansonsten gleich Passwörter verschlüsseln anders zu machen.Auf diese Weise kann ein Eindringling einen Wörterbuchangriff gegen eine ganze Liste von verschlüsselten Passwörtern nicht effizient nutzen.

  • Das (gemeinsam genutzte) "secret" wird vor dem Hashing einer Nachricht hinzugefügt, damit ein Eindringling keine eigenen Nachrichten erstellen und akzeptieren kann.

3

Der zweite Ansatz ist nur etwas sicherer. Salze schützen Benutzer vor Wörterbuchangriffen und Rainbow-Table-Angriffen. Sie machen es einem ambitionierten Angreifer schwerer, Ihr gesamtes System zu kompromittieren, sind aber dennoch anfällig für Angriffe, die sich auf einen Benutzer Ihres Systems konzentrieren. Wenn Sie Informationen verwenden, die öffentlich verfügbar sind, wie eine Telefonnummer, und der Angreifer diese erkennt, dann haben Sie sie einen Schritt in ihrem Angriff gespeichert. Natürlich ist die Frage, ob der Angreifer Ihre gesamte Datenbank, Salze und alles bekommt.

EDIT: Nach dem erneuten Lesen dieser Antwort und einige der Kommentare, kommt es mir vor, dass einige der Verwirrung aufgrund der Tatsache, dass ich nur die beiden sehr spezifischen Fällen in der präsentiert werden Frage: zufälliges Salz gegen nicht zufälliges Salz. Die Frage von mit einer Telefonnummer als Salz ist moot, wenn der Angreifer bekommt Ihre ganze Datenbank, nicht die Frage der Verwendung eines Salzes überhaupt.

+0

Wie schützen sie vor Wörterbuchangriffen? – tloach

+0

Indem der Angreifer gezwungen wird, ein neues Wörterbuch für jede Kombination aus Passwort + Salz zu erstellen. Ohne "salt" kann ein Wörterbuch für Ihre gesamte Kennwortetabelle verwendet werden. –

+0

"Natürlich ist die Frage, ob der Angreifer Ihre gesamte Datenbank, Salze und alles bekommt." Ist das nicht der Grund, warum das Salz verschlüsselt ist? –

2

Hier ist ein einfaches Beispiel zeigt, warum es schlecht ist für jeden Hash

Betrachten Sie die folgende Tabelle 1

UserId UserName, Password 
    1 Fred  Hash1 = Sha(Salt1+Password1)  
    2 Ted  Hash2 = Sha(Salt2+Password2)  

Fall 1, wenn Salz das gleiche Salz hat das gleiche wie salt2 ist Wenn Hash2 durch Hash1 ersetzt wird, könnte sich Benutzer 2 mit Benutzer 1 anmelden. Passwort

Fall 2, wenn Salz 1 nicht das gleiche Salz2 Wenn Hash2 durch Hash1 ersetzt wird, kann sich Benutzer2 nicht mit dem Kennwort des Benutzers 1 anmelden.

+0

Wir verwenden nicht denselben Hash für jedes Konto. Wir verwenden für jeden Hash denselben Informationstyp. Zum Beispiel ist das Salz für ein Konto die Telefonnummer des Kontos usw. – kemiller2002

+0

Ich weiß, dass dies eine lange Zeit später ist, aber ... Sie können sich nicht auf Salze verlassen, um sich gegen diese Art von Angriffen zu schützen. Wir müssen annehmen, dass ein Angreifer alles über das Authentifizierungssystem außer dem Geheimnis (d. H. Passwort) weiß. Daher müssen wir annehmen, dass der Angreifer weiß, a) was wir als das Salz verwenden (meistens ist dies in der gleichen Datenbank & Tabelle im Klartext gespeichert) und b) wie wir mit dem Salz ha- hen (dh anhängen, zweimal ha- etc). Wenn der Benutzer die Möglichkeit hat, die Hashes zu wechseln, müssen wir annehmen, dass er auch das Salz wechseln kann. Salze werden hier nicht helfen. –

-1

Wirklich, es hängt davon ab, welche Art von Angriff Sie versuchen, Ihre Daten zu schützen.

Der Zweck eines eindeutigen Salt für jedes Passwort besteht darin, einen Wörterbuchangriff auf die gesamte Passwortdatenbank zu verhindern.

Die Verschlüsselung des eindeutigen Salzes für jedes Passwort würde es schwieriger machen, ein individuelles Passwort zu knacken, aber Sie müssen abwägen, ob es wirklich einen großen Vorteil bringt. Wenn der Angreifer, mit brutalen Gewalt, stellt fest, dass diese Saite:

Marianne2ae85fb5d 

Hashes auf einen Hash in der DB gespeichert ist, ist es wirklich so schwer, herauszufinden, was der Teil der Pass ist und welcher Teil ist das Salz?

+2

Wenn jemand Brute zwingt so ein unmöglich zu erratendes Passwort, würde ich sagen, dass du sowieso abgespritzt wurdest, denn anscheinend haben sie Technologie, an die noch niemand gedacht hat. –

90

Das Verstecken eines Salzes ist nicht notwendig.

Für jeden Hash sollte ein anderes Salz verwendet werden. In der Praxis ist dies leicht zu erreichen, indem 8 oder mehr Bytes vom Zufallszahlengenerator mit kryptographischer Qualität erhalten werden.

Aus previous answer of mine:

Salz hilft vorausberechnete Wörterbuchangriffe zu vereiteln.

Angenommen, ein Angreifer hat eine Liste wahrscheinlicher Kennwörter. Er kann jede Hash und vergleichen Sie es mit dem Hash des Passworts seines Opfers, und sehen, ob es übereinstimmt. Wenn die Liste groß ist, kann dies lange dauern. Er braucht nicht so viel Zeit auf seinem nächsten Ziel zu verbringen, also zeichnet er das Ergebnis in einem "Wörterbuch" auf, wo ein Hash auf seinen entsprechenden Eingang zeigt. Wenn die Liste der Passwörter sehr, sehr lang ist, kann er Techniken wie eine Rainbow-Tabelle verwenden, um etwas Platz zu sparen.

Angenommen, sein nächstes Ziel hat sein Passwort gesalzen. Selbst wenn der Angreifer weiß, was das Salz ist, ist seine vorberechnete Tabelle wertlos - das Salz ändert den Hash, der sich aus jedem Passwort ergibt. Er muss alle Passwörter in seiner Liste erneut hashen, die Salz des Ziels an den Eingang anbringen. Jedes andere Salz benötigt ein anderes Wörterbuch, und wenn genug Salze verwendet werden, hat der Angreifer keinen Raum , um Wörterbücher für alle zu speichern. Handelsplatz, um Zeit zu sparen, ist keine länger eine Option; Der Angreifer muss jedes Passwort in seiner Liste für jedes Ziel, das er angreifen will, hashen.

Also ist es nicht notwendig, das Salz geheim zu halten. Sicherzustellen, dass der Angreifer kein vorberechnetes Wörterbuch hat, das dem bestimmten Salz entspricht, ist ausreichend.


darüber ein bisschen mehr Nach einigem Nachdenken, ich habe das selbst das Salz täuscht realisiert zu denken, versteckt gefährlich werden kann. Es ist viel besser anzunehmen, dass das Salz nicht versteckt werden kann, und das System dennoch so zu gestalten, dass es sicher ist. Ich gebe eine detailliertere Erklärung in another answer.

+1

Das Verstecken des Salzes ist notwendig, weil der Hash nicht gebrochen werden kann, bis er erhalten ist. Dies hängt mit CWE-760 zusammen (http://cwe.mitre.org/data/definitions/760.html) – rook

+22

@The Rook - Nein, Sie interpretieren dieses Problem falsch. Es bezieht sich auf die Verwendung von vorhersagbaren Salzen. Es sagt nichts darüber aus, das Salz geheim zu halten. In der Tat, Sie können das Salz nicht wirklich geheim halten, ohne ein anderes Geheimnis zu benutzen ... In welchem ​​Fall würden Sie das zweite Geheimnis nicht als Salz benutzen? Die Verwendung des Benutzernamens als Salz ist schlecht, da es wahrscheinlich ist, dass mehrere Systeme den gleichen Benutzernamen verwenden, was es lohnender macht, eine Tabelle für dieses bestimmte Salz zu erstellen. Zufällige Salze sind am besten, aber sie müssen nicht geheim gehalten werden. – erickson

+0

Siehe auch: http://StackOverflow.com/Questions/1645161/Salt-Generation-and-Open-Source-Software/1645190#1645190 – Jacco

2

... etwas wie ein Benutzername oder eine Telefonnummer, um den Hash zu salzen. ...

Meine Frage ist, ob der zweite Ansatz wirklich notwendig ist? Ich kann aus einer rein theoretischen Perspektive verstehen, dass es sicherer ist als der erste Ansatz, aber was ist aus praktischer Sicht?

Aus praktischer Sicht ist ein Salz ein Implementierungsdetail. Wenn Sie jemals ändern, wie Benutzerinformationen gesammelt oder gepflegt werden – und beide Benutzernamen und Telefonnummern manchmal ändern, um Ihre exakten Beispiele – zu verwenden, dann haben Sie möglicherweise Ihre Sicherheit kompromittiert. Möchten Sie, dass eine solche nach außen gerichtete Veränderung zu viel tieferen Sicherheitsbedenken führt?

Muss das Anhalten der Anforderung, dass jedes Konto eine Telefonnummer hat, eine vollständige Sicherheitsüberprüfung enthalten, um sicherzustellen, dass Sie diese Konten nicht zu einer Sicherheitsgefährdung geöffnet haben?

+1

Ganz zu schweigen davon, dass Sie, wenn Sie ein beliebiges Bit an Benutzerinformationen verwenden, diese Informationen ändern müssen, damit sie ihr Kennwort erneut eingeben, damit Sie es erneut mit dem neuen Salz verschlüsseln können. – Treborbob

2

Ein verstecktes Salz ist nicht mehr Salz. Es ist Pfeffer. Es hat seinen Nutzen. Es ist anders als Salz.

Pepper ist ein geheimer Schlüssel, der dem Passwort + salt hinzugefügt wird, wodurch der Hash zu einem HMAC (Hash Based Message Authentication Code) wird. Ein Hacker mit Zugriff auf die Hash-Ausgabe und das Salz kann theoretisch Brute Force eine Eingabe erraten, die den Hash generieren wird (und daher die Validierung in der Passwort-Textbox bestehen). Indem Sie Pfeffer hinzufügen, vergrößern Sie den Problembereich kryptografisch zufällig und machen das Problem ohne ernsthafte Hardware unlösbar.

Weitere Informationen zu Pfeffer finden Sie unter here.

Siehe auch hmac.