php - Passwörter verschlüsseln

Translate

Was ist der schnellste und dennoch sichere Weg, um Passwörter in (PHP bevorzugt) zu verschlüsseln, und für welche Methode Sie sich auch entscheiden, ist es portabel?

Mit anderen Worten, wenn ich meine Website später auf einen anderen Server migriere, funktionieren meine Passwörter dann weiterhin?

Die Methode, die ich jetzt verwende, hängt von den genauen Versionen der auf dem Server installierten Bibliotheken ab.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Wenn Sie sich für eine Verschlüsselungsmethode für Ihr Anmeldesystem entscheiden, ist die Geschwindigkeit nicht Ihr Freund. Jeff hatte mit Thomas Ptacek ein Problem mit Passwörtern und derFazitwar, dass Sie die langsamste und sicherste Verschlüsselungsmethode verwenden sollten, die Sie sich leisten können.

Aus dem Blog von Thomas Ptacek:
Geschwindigkeit ist genau das, was Sie in einer Passwort-Hash-Funktion nicht wollen.

Moderne Passwortschemata werden mit inkrementellen Passwortcrackern angegriffen.

Inkrementelle Cracker berechnen nicht alle möglichen geknackten Passwörter vor. Sie betrachten jeden Passwort-Hash einzeln und führen ihr Wörterbuch über die Passwort-Hash-Funktion auf die gleiche Weise wie Ihre PHP-Anmeldeseite. Rainbow Table Cracker wie Ophcrack verwenden Speicherplatz, um Passwörter anzugreifen. Inkrementelle Cracker wie John the Ripper, Crack und LC5 arbeiten mit der Zeit: Statistik und Berechnung.

Das Passwort-Angriffsspiel wird in der Zeit gewertet, die benötigt wird, um Passwort X zu knacken. Bei Regenbogentabellen hängt diese Zeit davon ab, wie groß Ihr Tisch sein muss und wie schnell Sie ihn durchsuchen 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, selbst herkömmliche Blockchiffren wie DES, sind schnell ausgelegt. MD5, SHA1 und DES sind schwache Passwort-Hashes. Auf modernen CPUs können rohe Kryptobausteine wie DES und MD5 bitgeschnitten, vektorisiert und parallelisiert werden, um die Passwortsuche blitzschnell zu machen. Game-over-FPGA-Implementierungen kosten nur Hunderte von Dollar.

Quelle
Translate

Ich bin bei Peter. Entwickler scheinen Passwörter nicht zu verstehen. Wir alle wählen MD5 oder SHA1 (und ich bin auch dafür schuldig), weil sie schnell sind. Darüber nachzudenken (weil mich kürzlich jemand darauf hingewiesen hat) macht keinen Sinn. Wir sollten einen Hashing-Algorithmus auswählen, der langsam dumm ist. Ich meine, auf der Skala der Dinge wird eine belebte Site Passwörter hashen, was? alle 1/2 Minute? Wen kümmert es, wenn es 0,8 Sekunden gegenüber 0,03 Sekunden auf dem Server dauert? Aber diese zusätzliche Langsamkeit ist enorm, um alle Arten von üblichen Brute-Forcish-Angriffen zu verhindern.

Nach meiner Lektüre wurde bcrypt speziell für sicheres Passwort-Hashing entwickelt. Es basiert auf Blowfish und es gibt viele Implementierungen.

Informationen zu PHP finden Sie unter PHPPasshttp://www.openwall.com/phpass/

Für alle, die .NET ausführen, lesen Sie BCrypt.NEThttp://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx

Quelle
Translate

Es sollte darauf hingewiesen werden, dass Sie nicht wollenVerschlüsselndas Passwort, das Sie möchtenHashes.

Verschlüsselte Passwörter können entschlüsselt werden, sodass jemand das Passwort sehen kann. Das Hashing ist eine Einwegoperation, sodass das ursprüngliche Passwort des Benutzers (kryptografisch) nicht mehr vorhanden ist.


Für welchen Algorithmus Sie sich entscheiden sollten - verwenden Sie den aktuell akzeptierten Standard:

  • SHA-256

Und wenn Sie das Passwort des Benutzers hashen, stellen Sie sicher, dass Sie auch einen anderen Junk damit hashen. z.B:

  • Passwort:password1
  • Salz:PasswordSaltDesignedForThisQuestion

Hängen Sie das Salz an das Passwort des Benutzers an:

String s = HashStringSHA256("password1PasswordSaltDesignedForThisQuestion");
Quelle
Translate

Was auch immer Sie tun, schreiben Sie keinen eigenen Verschlüsselungsalgorithmus. Wenn Sie dies tun, wird fast garantiert (es sei denn, Sie sind ein Kryptograf), dass der Algorithmus einen Fehler aufweist, der das Knacken trivial macht.

Quelle
Translate

Betrachten Sie zu verwendenbcryptEs wird in vielen modernen Frameworks wie Laravel verwendet.

Quelle
Translate

Ich bin nicht unbedingt auf der Suche nach dem schnellsten, aber einem guten Gleichgewicht. Einige der Server, für die dieser Code entwickelt wird, sind ziemlich langsam. Die Ausführung des Skripts, das das Kennwort hasht und speichert, dauert 5-6 Sekunden hat es auf das Hashing eingegrenzt (wenn ich das Hashing kommentiere, läuft es in 1-2 Sekunden).

Es muss nicht das sicherste sein, ich codiere nicht für eine Bank (im Moment), aber ich bin sicherWIRD NICHTSpeichern Sie die Passwörter als Klartext.

Quelle
Translate

password_hash ( string $password , int $algo [, array $options ] ). (PHP 5> = 5.5.0, PHP 7)

password_hash () erstellt einen neuen Passwort-Hash mithilfe eines starken Einweg-Hashing-Algorithmus. password_hash () ist kompatibel mit crypt (). Daher können von crypt () erstellte Kennwort-Hashes mit password_hash () verwendet werden.

Quelle