2008-08-03 12 views
27

Was ist die schnellste und sicherste Methode zum Verschlüsseln von Passwörtern (PHP bevorzugt), und für welche Methode wählen Sie Portable?Verschlüsselnde Passwörter

Mit anderen Worten, wenn ich meine Website später auf einen anderen Server migrieren werde funktionieren meine Passwörter weiter?

Die Methode, die ich jetzt benutze, wie mir gesagt wurde, hängt von den genauen Versionen der auf dem Server installierten Bibliotheken ab.

Antwort

29

Wenn Sie eine Verschlüsselungsmethode für Ihr Login-System wählen, dann ist Geschwindigkeit nicht Ihr Freund, Jeff hatte eine Beziehung mit Thomas Ptacek über Passwörter und die conclusion war, dass Sie die langsamste, sicherste Verschlüsselungsmethode verwenden sollten du kannst es dir leisten.

Von Thomas Ptacek Blog:
Speed ​​ist genau das, was Sie wollen nicht in einer Hash-Funktion Passwort.

Moderne Kennwortschemas werden mit inkrementellen Kennwort-Crackern angegriffen.

Inkrementelle Cracker berechnen nicht alle möglichen geknackten Kennwörter vorberechnen. Sie betrachten jeden Passwort-Hash einzeln, und sie füttern ihr Wörterbuch durch die Passwort-Hash-Funktion auf die gleiche Weise wie Ihre PHP-Login-Seite. Rainbow-Tabellencracker wie Ophcrack verwenden Speicherplatz, um Passwörter anzugreifen; Inkrementelle Cracker wie John the Ripper, Crack und LC5 arbeiten mit der Zeit: Statistik und Rechenleistung.

Das Passwort-Angriffsspiel wird in Zeitaufwand geknackt, um Passwort X zu knacken. Bei Rainbow-Tischen hängt diese Zeit davon ab, wie groß Ihr Tisch sein muss und wie schnell Sie ihn suchen können. Bei inkrementellen Crackern hängt die Zeit davon ab, wie schnell Sie die Kennwort-Hash-Funktion ausführen können.

Je besser Sie Ihre Passwort-Hash-Funktion optimieren können, desto schneller wird Ihre Passwort-Hash-Funktion, desto schwächer ist Ihr Schema. MD5 und SHA1, auch konventionelle Blockchiffren wie DES, sind auf Schnelligkeit ausgelegt. MD5, SHA1 und DES sind schwache Kennworthashes. Auf modernen CPUs können rohe Krypto-Bausteine ​​wie DES und MD5 bitsliced, vektorisiert und parallelisiert werden, um Passwortsuchen blitzschnell durchzuführen. Game-over-FPGA-Implementierungen kosten nur Hunderte von Dollar.

14

Ich bin mit Peter. Entwickler scheinen Passwörter nicht zu verstehen. Wir alle wählen (und ich bin auch schuldig) MD5 oder SHA1, weil sie schnell sind. Wenn ich darüber nachdenke (weil mir kürzlich jemand darauf hingewiesen hat), ergibt das keinen Sinn. Wir sollten einen Hash-Algorithmus auswählen, der blöd langsam ist. Ich meine, auf der Skala der Dinge wird eine hektische Seite Passwörter was hash? jede 1/2 Minute? Wen interessiert es, wenn es 0,8 Sekunden vs 0,03 Sekunden Server-weise dauert? Aber diese Extra-Langsamkeit ist enorm, um alle Arten von üblichen Brute-Forcish-Angriffen zu verhindern.

Aus meiner Sicht ist bcrypt speziell für sicheres Passwort Hashing konzipiert. Es basiert auf Blowfish und es gibt viele Implementierungen.

Für PHP, überprüfen PHPPass out http://www.openwall.com/phpass/

Für alle tun .NET Besuche BCrypt.NET http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

2

ich nicht unbedingt bin für die schnellste, aber eine gute Balance, etwas von dem Server suchen, Dieser Code wird entwickelt, weil er ziemlich langsam ist, das Skript, das das Passwort hasht und speichert, dauert 5-6 Sekunden, und ich habe es auf den Hashing beschränkt (wenn ich das Hashing kommentiere, läuft es in 1- 2 Sekunden).

Es ist nicht die sicherste sein muss, ich bin nicht codding für eine Bank (jetzt), aber ich sicherlich WILL NOT speichern die Passwörter als Klartext.

+0

Während dies geschlossen ist, sollten Sie weiterhin Passwörter so sicher wie möglich hacken. Was ist der einfachste Weg, jemandes Konto Passwort zu bekommen? Erstellen Sie eine fantastisch aussehende Website, auf der Sie sich anmelden können. Die meisten Benutzer verwenden vorhandene Kennwörter. Jetzt haben Sie eine riesige Liste von Passwörtern. Der schnellste Weg, um die Passwörter anderer Leute zu bekommen, wäre, Ihr System zu hacken, wenn ich wüsste, dass es eine schlechte Implementierung ist. –

8

Es sollte darauf hingewiesen werden, dass Sie nicht das Passwort zu verschlüsseln wollen, möchten Sie Hash es.

Verschlüsselte Passwörter können entschlüsselt werden, damit jemand das Passwort sehen kann. Hashing ist eine Ein-Weg-Operation, so dass das ursprüngliche Passwort des Benutzers (kryptographisch) verschwunden ist.


Wie für die Algorithmus Sie wählen sollten - verwenden, um die gegenwärtig akzeptierten Standard ein:

  • SHA-256

Und wenn Sie das Kennwort des Benutzers Hash, sollten Sie auch auf Hash in irgendeinem anderen Trödel mit ihm. zB:

  • Passwort: password1
  • Salz: PasswordSaltDesignedForThisQuestion

Fügen Sie das Salz das Kennwort des Benutzers:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion"); 
+4

-1 SHA-256 ist keine Kennwort-Hashing-Funktion und ist für diesen Zweck nicht sicher. Es kann * Teil von einem sein * (PBKDF2), aber das ist etwas ganz anderes. Auch Ihr Beispiel ist irreführend, denn das Salz sollte keine schlaue Phrase sein, es sollte ein zufälliger (pro Benutzer) Wert sein. –

7

Was immer Sie tun, nicht Ihren eigenen Verschlüsselungsalgorithmus schreiben . Dadurch wird fast garantiert (es sei denn, Sie sind ein Kryptograf), dass es einen Fehler im Algorithmus gibt, der es trivial macht, zu knacken.

+0

Auch wenn Sie ein Kryptograf sind, wird es wahrscheinlich einen Fehler haben - es dauert Jahre der Überprüfung, bevor ein Algorithmus "populär" wird –

+1

Das ist so wahr. Und erinnert mich an eine ähnliche Anekdote von Don Knuth nach dem Motto: Vor langer Zeit versuchte er, einen Zufallszahlengenerator zu schreiben und so viele obskure Operationen zusammenzuschustern, wie ihm einfiel. Schließlich führte er diese monumentale Schöpfung und gab die Nummer 4 auf unbestimmte Zeit aus. (Die Details wurden möglicherweise in der Nacherzählung geändert.) – ndkrempel

2

Verwenden Sie bcrypt es ist in vielen modernen Frameworks wie Laravel verwendet.