Wie implementiere ich Salz in meinem login-Passwörter?
Ich umsetzen will, ein Salz in meinem login-system, bin aber ein bisschen verwirrt, wie das funktionieren soll. Ich verstehe nicht die Logik dahinter. Ich verstehe md5 ist ein Einweg-Algorithmus und alle Funktionen, die ich begegnet bin, scheinen hash-alles zusammen. Wenn dies der Fall ist, wie bekommt man das Passwort wieder aus zum Vergleich? Meine größte Frage ist, wie ist das Salzen eine Benutzer-Passwort sicherer als nur das Hashen des Passworts? Wenn eine Datenbank wurde jemals kompromittiert werden, wird der hash zusammen mit dem salt in der Datenbank. Ist das alles nicht, dass ein hacker brauchen würde?
Ich fand auch einen anderen post hier auf, DAMIT, wo ein anderer Entwickler sagte :
"Sicherzustellen, dass Ihre Salz-und-Algorithmus sind
gespeichert getrennt von der Datenbank"
Möchte ich speichern das Salz in der Datenbank. Ist das wirklich ein problem, wenn ich tun?
Ich bin auf der Suche nach etwas Hilfe, auf Verständnis, wie dies funktioniert und auch, was die beste Vorgehensweise sein könnte. Jede Hilfe wird sehr geschätzt.
BEARBEITEN:
Ich danke allen für Ihre Antworten und Ideen. Auch wenn ich möglicherweise mehr verwirrt nun, es ist sicherlich eine Erfahrung für mich. Nochmals vielen Dank Jungs.
- Willkommen ALSO. Große erste Frage.
- stackoverflow.com/questions/873403/net-impl-of-bcrypt
- Verwandte Lesen: Die Rainbow-Table Ist Tot
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer hash-Funktion immer wieder den gleichen Wert für den gleichen Eingabe-string. Lassen Sie uns sagen, meine Benutzer (Alice) hat das Passwort
secret
. Hashingsecret
mitmd5()
führt zu der folgenden hash -Mithilfe eines Wörterbuchs (eine Liste der häufigsten Wörter und Passwort) oder in einem der verschiedenen Websites, die Ihnen diesen Dienst, der Angreifer (Mallory) leicht finden können, das Passwort ist geheim, wenn er sieht, in seinem Wörterbuch, dass
5ebe2294ecd0e0f08eab7690d2a6ee69 = secret
.Den Prozess der Salzen vor Vermischung macht es schwieriger, verwenden Sie ein Wörterbuch-Angriff, ohne zu wissen, Ihr Salz. Betrachten Sie das folgende:
Der resultierende hash wird nun
b58ad809eece17322de5024d79299f8a
aber Alice das Passwort ist immer nochsecret
. Wenn nun Mallory bekommt Ihr die Hände auf die gesalzenen hash, die Chancen sind Sie nicht finden die Antwort in Ihrem Wörterbuch. Wenn Sie nicht, das Wörterbuch werde Sie geben die falsche Antwort.Speichern Sie niemals ein statischer salt in der Datenbank. Vorzugsweise speichern Sie es mit Ihrer Anwendung Konfiguration (was übrigens nicht verfügbar sein sollten aus dem Internet).
Wenn Sie gehen, um eine dynamische Salz, sind Sie gehen zu müssen, um die Datenbank verwenden. Verwenden Sie einen nicht-null-Spalte des vorhandenen gültigen Daten, bauen Sie Ihre Salz auf (blowfish-verschlüsselte string der Benutzername basiert auf einer geheimen Verschlüsselungs-Schlüssel wird in der Regel kryptografisch sicheren). Tun nicht verwenden Sie eine separate Spalte für den salt. Wenn Sie nicht verwenden Sie eine vorhandene Spalte, integrieren Sie Ihr Salz-in der gleichen Spalte, als Ihr hash. Verwenden Sie beispielsweise die ersten 32 Zeichen 128-bit Salz und dann die letzten 40, die für Ihre 160-bit-hash. Die folgende Funktion erzeugt eine solche hash:
Wenn ein Angreifer bekommt in Ihrer Datenbank mit Hilfe von SQL-injection, zumindest die hashes er/Sie ruft nicht hilfreich, da er/Sie nicht haben Zugriff auf Ihre Anwendung-Konfiguration. Wenn Ihr server bekommt verwurzelt, es ist ziemlich viel Spiel over, egal was Sie tun.
Hinweis: Es gibt andere Arten von Angriff möglich auf
md5()
, das ist, warum Sie die Verwendung sicherer Hash-Algorithmus,sha1()
zum Beispiel. Oder, noch besser, verwenden Sie die Portable PHP password hashing framework, die wurde entworfen mit Sicherheit im Verstand und ist rückwärts kompatibel mit so ziemlich jeder PHP-version.bcrypt
. Wörterbücher existieren für Sie als gut. Sie sind nur weniger verfügbar. Tut mir Leid zu sagen, Wörterbücher ist eine Schwäche, dass keine Hash-Algorithmus lösen kann. Wenn ich das nicht knacken Ihrebcrypt
hash-genug Zeit, um mit einer Maschine, ich werde ein cluster. Wenn es immer noch nicht schnell genug, ich werde mieten Sie ein bot-Netz. Und Sie wissen nicht, wie schnell wir in der Lage sein, um hash einbcrypt
hash in einem Jahr. Seine vermeintliche Sicherheit durch Langsamkeit ist bereits gebrochen, fürchte ich.salt
.totally
Spiel über, aus dem Quellcode kann man studieren, alle Injektionen und Pannen können Sie ausführt, dass die DB bleibt ziemlich ungeschützt 🙂test.php
aus dem 0,1 Verteilung der phppass.test.php
sind hier: cvsweb.openwall.com/cgi/cvsweb.cgi/projects/phpass Der code-block ist nicht drin. Also ich stehe zu meiner ursprünglichen Forderung.Dem Punkt ein Salz ist zu verhindern, dass Angreifer aus der Amortisation der Kosten für brute-force-Angriffe auf Websites (oder noch besser, wenn mit einem anderen Salz für jeden Nutzer: alle Nutzer einer site) durch vorausberechnete Regenbogen-Tabellen.
Mit einfachem hashing, kann ein Angreifer berechnen Sie eine solche Tabelle einmal (ein sehr langer, kostspieliger Vorgang) und dann verwenden Sie es, um schnell zu finden Passwörter für jede Website. Wenn eine Website verwendet eine Feste Salz -, muss der Angreifer berechnen Sie eine neue Tabelle, die speziell für diese Website. Wenn eine Website verwendet ein anderes Salz für jeden Benutzer kann der Angreifer Hör auf mit rainbow-Tabellen - er haben werde, um brute-force jedes einzelne Kennwort separat.
Speicherung der Salze getrennt ist nicht notwendig, diesen Vorteil zu erlangen. In der Theorie wäre es sogar sicherer, da es würde neutralisieren die Schwäche Wörterbuch oder kurze Passwörter. In der Praxis ist es nicht Wert die Mühe mit denn am Ende des Tages, müssen Sie Zugriff auf die Salze irgendwo zu überprüfen Passwörter. Auch, versuchen, Sie zu trennen würde dazu führen, dass mehr komplexe Systeme - und je komplexer ein system ist, desto mehr Möglichkeiten für Sicherheitslücken es gibt.
Edit: Meine konkreten Empfehlungen:
Vergessen über die Verwendung von Salzen (teilweise aus dem Grund, die Sie erwähnen), verwenden Sie bcrypt statt:
Für eine gute Erklärung finden Sie unter: http://codahale.com/how-to-safely-store-a-password/
bcrypt
ist der beste Weg zu gehen, bis das Gegenteil bewiesen gebrochen. Alle hashing-Algorithmus, durch die pure definition eines hashing-Algorithmus, das bedeutet, man Eingabe = Ausgabe auf. Die Geschwindigkeit, gibt keine Sicherheit (wer weiß, welche Geschwindigkeiten wir in der Lage sein zu berechnen, die in einem Jahr). Und wenn ein computer ist nicht genug, um brute-force Ihrebcrypt
hash, ich werde laufen meine software auf einem freaking botnet, das Ergebnis zu erhalten. Mein Punkt ist, dassbcrypt
ist nicht sicherer als alle salt+hash um.bcrypt
hat die einzigartige pro-Kennwort Salz in die endgültige hash. Es kümmert sich um alles, so dass alles in Ordnung ist mit ihm.Die anderen Antworten sind gut, so werde ich nur werfen Sie in eine kleine Stelle, die sonst niemand erwähnt hat. Sie don ' T wollen, verwenden Sie ebenfalls den gleichen salt für jedes Passwort, weil dann, wenn zwei Menschen das gleiche Kennwort haben, müssen Sie den gleichen hash. Das bereitstellen von Informationen, die ein Angreifer ausnutzen kann.
Können Sie den gleichen salt für alle Benutzer zusammen mit Juraj ist eine gute Idee, kombiniert das Kennwort mit anderen nicht-änderung der Datenbank-Felder (nur für einen Benutzer). Aber aufpassen, da diese Informationen bekommt gebunden an das Passwort. Wenn Sie hash des Benutzernamen + Passwort zusammen garantieren einen eindeutigen hash, Sie wäre nicht in der Lage, ändern Sie den Benutzernamen-ohne einen neuen Benutzer zu erstellen und Ihnen zu verlangen, sich ein neues Passwort setzen.
Als ein Beispiel für eine einzigartige Salz pro Benutzer und speichern Sie neben dem Passwort-hash, ich werde darauf hinweisen, /etc/shadow auf der typischen Linux-system.
Hier, die oL5TTZxL ist das Salz und RhfGUZSbFwQN6jnX5D.Ck/ ist der hash. Die nur-text-Kennwort ist root in diesem Fall, und der hash-Algorithmus, der mein system verwendet wird, ist der MD5-basierten BSD-Passwort-Algorithmus. (neuere Systeme, als meine bessere hash-algorithmen)
Bekommen Sie nicht, das Kennwort für den Vergleich. Sie verschlüsseln Sie das Kennwort, wenn Sie versuchen, einen login und vergleichen der gespeicherte Wert mit den neu verschlüsselten Wert.
Als Sie erwähnt, hashing algorithmen funktionieren nur in einer Richtung (oder nur wenn Sie stark genug sind :-D)
Deiner Frage, Salzen würde ich empfehlen, ein Kennwort hash mit einem statischen salt-string und einige dynamische Daten aus der Datenbank, die sollte nicht ändern nachdem Sie einmal erstellt
Dies ist eine sehr sichere Art der Speicherung von Passwörter, selbst wenn die Datenbank kompromittiert wird, die Hacker/Cracker immer noch brauchen, um Ihre statische string-hash und müssen erraten, wie Sie angewandt allen Salzen..
Zum Beispiel lassen Sie uns sagen, Sie haben eine
users
Tabelle mit diesen Spalten:Spalten id und created_at nach einmal gefüllt, sollten niemals geändert werden..
so, wenn Sie sind hashing-Benutzers Kennwort, das Sie tun können, so einfach wie:
Ich hoffe, das hilft 🙂 cheers
Hashing der Passwörter gemeint ist, um diese Passwörter geheim von Ihrem eigenen administrator(en).
1) Halten Sie Passwörter im Klartext in Ihrer Datenbank wäre in Ordnung, außer Ihre Passwörter können vom administrator verwendet, um den Zugang zu einem anderen system.
2) können Sie eine einzige Globale Salz, die in Kombination mit den Passwörtern (durch voranstellen oder XORing) und dann das hashing für die Speicherung in der Datenbank. Das ist aber anfällig für einen administrator UND eine rainbow-table ausgelegt, dass ein Salz.
3) Sie können einen separaten Salz für jeden Benutzer: Die Datenbank wird zum speichern des salt und der hash-abgeleitet von dem Kennwort/salt-Kombination. Dies verhindert eine rainbow-table-Angriff, aber brute-force-Angriffe sind weiterhin möglich.
4) Schließlich können Sie Ihre hash-Funktion einen geheimen durch die Verwendung eines Geschwindigkeits-beschränkten hardware-hashing-Lösung.
Das ist so gut wie Sie tun können. Weil der menschlichen Natur, die Passwörter haben eine begrenzte Domäne und sind anfällig für brute-force-Angriffe. Wir versuchen zu verhindern, dass Administratoren immer ein halten Sie Benutzer-Passwörter, und dann verwenden Sie Sie auch auf anderen Systemen, die Sie keinen Zugriff haben sollten.
Einige andere Notizen:
a) können Sie bcrypt auf die Kennwort-Salz-Kombination zu verlangsamen die Angreifer brute-force-Angriff. Da wir aber davon aus, Administratoren, Sie können geduldig sein.
b) Halten Sie das Salz getrennt von den Kennwort-hash ist keine wirksame Verteidigung, die wir sind, vorausgesetzt, Administratoren, nachdem alle.
c) Verwendung vorhandener Daten als Salz ist ein wenig besser, aber ich bezweifle, dass vorhandene Daten, wie viel Entropie eine zufällige Salz hat.
Salzen Sie das Kennwort eines Benutzers ist möglicherweise sicherer als hashing nur das Passwort, denn es kann zum Schutz gegen precomputation Angriffe.
Zum Beispiel, wenn ein hacker bekommt Zugriff auf Ihre Datenbank und die Passwörter sind nicht gesalzen, dann kann er schauen, bis die hashes in seiner Datenbank mit hashes (siehe http://en.wikipedia.org/wiki/Rainbow_table), um die ursprünglichen Passwörter.