HAFTUNGSAUSSCHLUSS : Diese Antwort wurde 2008 geschrieben.
Seitdem hat uns PHP gegeben password_hash
und password_verify
seit ihrer Einführung sind sie die empfohlene Methode zum Hashing und Überprüfen von Passwörtern.
Die Theorie der Antwort ist jedoch immer noch eine gute Lektüre.
TL; DR
Nicht
- Beschränken Sie nicht, welche Zeichen Benutzer für Kennwörter eingeben können. Das machen nur Idioten.
- Begrenzen Sie nicht die Länge eines Passworts. Wenn Ihre Benutzer einen Satz mit supercalifragilisticexpialidocious möchten, hindern Sie sie nicht daran, ihn zu verwenden.
- Entfernen oder entkommen Sie HTML und Sonderzeichen im Passwort nicht.
- Speichern Sie das Passwort Ihres Benutzers niemals im Klartext.
- Senden Sie Ihrem Benutzer niemals ein Passwort per E-Mail, es sei denn, er hat sein Passwort verloren und Sie haben ein temporäres Passwort gesendet.
- Protokollieren Sie niemals Passwörter auf irgendeine Weise.
- Hash-Passwörter niemals mit SHA1 oder MD5 oder sogar SHA256! Moderne Cracker können 60 bzw. 180 Milliarden Hashes / Sekunde überschreiten.
- Mischen Sie nicht bcrypt und mit dem rohen Ausgang von Hash () , entweder Verwendung hex Ausgang oder base64_encode es. (Dies gilt für alle Eingaben, die möglicherweise einen Schurken enthalten
\0
, der die Sicherheit ernsthaft schwächen kann.)
DOS
- Verwenden Sie scrypt, wenn Sie können. bcrypt wenn du nicht kannst.
- Verwenden Sie PBKDF2, wenn Sie weder bcrypt noch scrypt mit SHA2-Hashes verwenden können.
- Setzen Sie alle Passwörter zurück, wenn die Datenbank gefährdet ist.
- Implementieren Sie eine angemessene Mindestlänge von 8 bis 10 Zeichen und benötigen Sie mindestens 1 Großbuchstaben, 1 Kleinbuchstaben, eine Zahl und ein Symbol. Dies verbessert die Entropie des Passworts und erschwert das Knacken. (Weitere Informationen finden Sie im Abschnitt "Was macht ein gutes Passwort aus?".)
Warum überhaupt Hash-Passwörter?
Das Ziel von Hashing-Passwörtern ist einfach: Verhindern Sie böswilligen Zugriff auf Benutzerkonten, indem Sie die Datenbank gefährden. Das Ziel des Passwort-Hashing ist es also, einen Hacker oder Cracker davon abzuhalten, indem er ihnen zu viel Zeit oder Geld kostet, um die Klartext-Passwörter zu berechnen. Und Zeit / Kosten sind die besten Abschreckungsmittel in Ihrem Arsenal.
Ein weiterer Grund, warum Sie einen guten, robusten Hash für Benutzerkonten wünschen, besteht darin, Ihnen genügend Zeit zu geben, um alle Kennwörter im System zu ändern. Wenn Ihre Datenbank kompromittiert ist, benötigen Sie genügend Zeit, um das System zumindest zu sperren, wenn nicht jedes Kennwort in der Datenbank geändert wird.
Jeremiah Grossman, CTO von Whitehat Security, erklärte auf dem White Hat Security-Blog nach einer kürzlich erfolgten Passwortwiederherstellung, bei der sein Passwortschutz mit Gewalt gebrochen werden musste:
Interessanterweise habe ich beim Ausleben dieses Alptraums VIEL gelernt, was ich nicht über das Knacken, Speichern und die Komplexität von Passwörtern wusste. Ich habe verstanden, warum das Speichern von Passwörtern so viel wichtiger ist als die Komplexität von Passwörtern. Wenn Sie nicht wissen, wie Ihr Passwort gespeichert ist, können Sie sich nur auf die Komplexität verlassen. Dies mag Kennwort- und Krypto-Profis allgemein bekannt sein, aber für den durchschnittlichen InfoSec- oder Web Security-Experten bezweifle ich dies sehr.
(Hervorhebung von mir.)
Was macht ein gutes Passwort überhaupt aus?
Entropie . (Nicht, dass ich Randalls Standpunkt voll und ganz unterschreibe.)
Kurz gesagt, Entropie gibt an, wie stark das Passwort variiert. Wenn ein Passwort nur aus römischen Kleinbuchstaben besteht, sind das nur 26 Zeichen. Das ist nicht viel Abwechslung. Alphanumerische Passwörter sind mit 36 Zeichen besser. Das Zulassen von Groß- und Kleinbuchstaben mit Symbolen beträgt jedoch ungefähr 96 Zeichen. Das ist viel besser als nur Briefe. Ein Problem ist, dass wir Muster einfügen, um unsere Passwörter einprägsam zu machen - was die Entropie verringert. Hoppla!
Die Passwortentropie lässt sich leicht approximieren . Die Verwendung des gesamten Bereichs von ASCII-Zeichen (ungefähr 96 typisierbare Zeichen) ergibt eine Entropie von 6,6 pro Zeichen, was mit 8 Zeichen für ein Kennwort für zukünftige Sicherheit immer noch zu niedrig ist (52,679 Bit Entropie). Die gute Nachricht ist jedoch: Längere Passwörter und Passwörter mit Unicode-Zeichen erhöhen die Entropie eines Passworts erheblich und erschweren das Knacken.
Auf der Crypto StackExchange- Site wird die Kennwortentropie länger diskutiert . Eine gute Google-Suche liefert auch viele Ergebnisse.
In den Kommentaren sprach ich mit @popnoodles, der darauf hinwies, dass das Durchsetzen einer Kennwortrichtlinie mit einer Länge von X mit X vielen Buchstaben, Zahlen, Symbolen usw. die Entropie tatsächlich reduzieren kann, indem das Kennwortschema vorhersehbarer gemacht wird. Ich stimme zu. Zufälligkeit, so wirklich zufällig wie möglich, ist immer die sicherste, aber am wenigsten einprägsame Lösung.
Soweit ich das beurteilen konnte, ist das Erstellen des weltweit besten Passworts ein Catch-22. Entweder ist es nicht einprägsam, zu vorhersehbar, zu kurz, zu viele Unicode-Zeichen (auf einem Windows / Mobile-Gerät schwer einzugeben), zu lang usw. Kein Passwort ist für unsere Zwecke wirklich gut genug, daher müssen wir sie so schützen, als ob sie es wären waren in Fort Knox.
Empfohlene Vorgehensweise
Bcrypt und Scrypt sind die aktuellen Best Practices. Scrypt wird mit der Zeit besser sein als bcrypt, aber es wurde weder von Linux / Unix noch von Webservern als Standard übernommen, und es wurden noch keine eingehenden Überprüfungen des Algorithmus veröffentlicht. Dennoch sieht die Zukunft des Algorithmus vielversprechend aus. Wenn Sie mit Ruby arbeiten, gibt es ein Verschlüsselungsjuwel , das Ihnen helfen wird, und Node.js hat jetzt ein eigenes Verschlüsselungspaket . Sie können Scrypt in PHP entweder über die Scrypt- Erweiterung oder die Libsodium- Erweiterung verwenden (beide sind in PECL verfügbar).
Ich schlage vor , hoch in der Dokumentation zum Lesen Krypta Funktion , wenn Sie verstehen wollen , wie bcrypt zu verwenden oder sich selbst eine Suche nach guten Wrapper oder die Verwendung so etwas wie PHPASS für eine Legacy - Implementierung. Ich empfehle mindestens 12 Runden bcrypt, wenn nicht 15 bis 18.
Ich habe meine Meinung über die Verwendung von bcrypt geändert, als ich erfuhr, dass bcrypt nur den Schlüsselplan von Blowfish mit einem variablen Kostenmechanismus verwendet. Mit letzterem können Sie die Kosten für Brute-Force-Kennwörter erhöhen, indem Sie den bereits teuren Schlüsselplan von Blowfish erhöhen.
Durchschnittliche Praktiken
Ich kann mir diese Situation fast nicht mehr vorstellen. PHPASS unterstützt PHP 3.0.18 bis 5.3, sodass es für fast jede denkbare Installation verwendet werden kann - und sollte verwendet werden, wenn Sie nicht sicher sind, dass Ihre Umgebung bcrypt unterstützt.
Angenommen, Sie können bcrypt oder PHPASS überhaupt nicht verwenden. Was dann?
Versuchen Sie eine Implementierung von PDKBF2 mit der maximalen Anzahl von Runden , die Ihre Umgebung / Anwendung / Benutzerwahrnehmung tolerieren kann. Die niedrigste Zahl, die ich empfehlen würde, ist 2500 Runden. Stellen Sie außerdem sicher, dass Sie hash_hmac () verwenden, wenn es verfügbar ist, um die Wiedergabe des Vorgangs zu erschweren.
Zukünftige Praktiken
PHP 5.5 ist eine vollständige Passwortschutzbibliothek, die alle Probleme bei der Arbeit mit bcrypt beseitigt. Während die meisten von uns in den meisten gängigen Umgebungen, insbesondere bei gemeinsam genutzten Hosts, mit PHP 5.2 und 5.3 nicht weiterkommen, hat @ircmaxell eine Kompatibilitätsschicht für die kommende API erstellt, die abwärtskompatibel zu PHP 5.3.7 ist.
Zusammenfassung und Haftungsausschluss für Kryptografie
Die Rechenleistung, die erforderlich ist, um ein Hash-Passwort tatsächlich zu knacken, ist nicht vorhanden. Die einzige Möglichkeit für Computer, ein Kennwort zu "knacken", besteht darin, es neu zu erstellen und den zum Sichern verwendeten Hashing-Algorithmus zu simulieren. Die Geschwindigkeit des Hashs hängt linear von seiner Fähigkeit ab, brutal gezwungen zu werden. Schlimmer noch, die meisten Hash-Algorithmen können einfach parallelisiert werden, um eine noch schnellere Leistung zu erzielen. Aus diesem Grund sind kostspielige Schemata wie bcrypt und scrypt so wichtig.
Sie können unmöglich alle Bedrohungen oder Angriffsmöglichkeiten vorhersehen und müssen daher Ihr Bestes tun, um Ihre Benutzer im Voraus zu schützen . Wenn Sie dies nicht tun, verpassen Sie möglicherweise sogar die Tatsache, dass Sie angegriffen wurden, bis es zu spät ist ... und Sie haften . Um diese Situation zu vermeiden, handeln Sie zunächst paranoid. Greifen Sie Ihre eigene Software (intern) an und versuchen Sie, Benutzeranmeldeinformationen zu stehlen, die Konten anderer Benutzer zu ändern oder auf deren Daten zuzugreifen. Wenn Sie die Sicherheit Ihres Systems nicht testen, können Sie nur sich selbst die Schuld geben.
Schließlich: Ich bin kein Kryptograf. Was auch immer ich gesagt habe, ist meine Meinung, aber ich denke, es basiert auf gesundem Menschenverstand ... und viel Lesen. Denken Sie daran, seien Sie so paranoid wie möglich, machen Sie es so schwer wie möglich, sich einzumischen, und wenden Sie sich dann, wenn Sie immer noch besorgt sind, an einen White-Hat-Hacker oder Kryptographen, um zu erfahren, was er über Ihren Code / Ihr System sagt.