Wie hash lange Passwörter (>72 Zeichen) mit blowfish
Der letzten Woche Las ich eine Menge Artikel über Passwort-hashing und Blowfish zu sein scheint (einer) der beste hashing-Algorithmus, der jetzt - aber das ist nicht das Thema dieser Frage!
Der 72-Zeichen-Grenze
Blowfish-nur die ersten 72 Zeichen in der eingegebenen Kennwort:
<?php
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$hash = password_hash($password, PASSWORD_BCRYPT);
var_dump($password);
$input = substr($password, 0, 72);
var_dump($input);
var_dump(password_verify($input, $hash));
?>
Ausgabe:
string(119) "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)"
string(72) "Wow. This is a super secret and super, super long password. Let's add so"
bool(true)
Wie Sie sehen können, werden nur die ersten 72 Zeichen Angelegenheit. Twitter ist mit blowfish aka bcrypt, um Ihre Kennwörter speichern (https://shouldichangemypassword.com/twitter-hacked.php) und ratet mal, was: ändern Sie Ihr twitter-Passwort ein langes Passwort mit mehr als 72 Zeichen und können Sie in Ihrem Konto anmelden, indem Sie nur die ersten 72 Zeichen.
Blowfish und Pfeffer
Gibt es eine Menge unterschiedliche Meinungen über "würzen" Passwörter. Einige Leute sagen, es ist nicht nötig, denn Sie müssen davon ausgehen, dass das Geheimnis Pfeffer-string ist auch bekannt/veröffentlicht, damit es nicht zu verbessern die hash. Ich habe eine separate Datenbank-server, so ist es durchaus möglich, dass nur die Datenbank geleakt und nicht die ständige Pfeffer.
In diesem Fall (Pfeffer nicht durchgesickert) Sie machen einen Angriff basiert auf einem Wörterbuch mehr schwierig (korrigiert mich wenn das nicht stimmt). Wenn Ihr Pfeffer-string ist auch durchgesickert: nicht schlecht - Sie haben noch das Salz und es ist so gut geschützt, wie ein hash ohne Pfeffer.
So, ich denke, würzen das Kennwort ist zumindest keine schlechte Wahl.
Vorschlag
Mein Vorschlag um eine Blowfish-hash für ein Passwort mit mehr als 72 Zeichen (und Pfeffer):
<?php
$pepper = "foIwUVmkKGrGucNJMOkxkvcQ79iPNzP5OKlbIdGPCMTjJcDYnR";
//Generate Hash
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$password_peppered = hash_hmac('sha256', $password, $pepper);
$hash = password_hash($password_peppered, PASSWORD_BCRYPT);
//Check
$input = substr($password, 0, 72);
$input_peppered = hash_hmac('sha256', $input, $pepper);
var_dump(password_verify($input_peppered, $hash));
?>
Diese basiert auf diese Frage: password_verify
zurück false
.
Die Frage
Was ist der sicherere Weg? Immer ein SHA-256-hash der ersten (die gibt 64 Zeichen) oder betrachten nur die ersten 72 Zeichen des Passworts?
Profis
- Kann der Benutzer nicht mehr anmelden, indem Sie nur die ersten 72 Zeichen
- Können Sie fügen Sie den Pfeffer ohne überschreitung der Zeichen-limit
- Die Ausgabe von hash_hmac würde wahrscheinlich haben mehr Entropie als das Passwort selbst
- Das Passwort gehasht ist mit zwei verschiedenen Funktionen
Nachteile
- Nur 64 Zeichen werden verwendet, um den blowfish-hash
Edit 1: Diese Frage richtet sich nur die PHP-integration von blowfish/bcrypt. Vielen Dank für die Kommentare!
- Blowfish ist nicht der einzige, der schneidet das Kennwort, irreführende Menschen zu denken, es ist sicherer, als es tatsächlich ist. Hier ist ein interessante Geschichte des 8-Zeichen-limit.
- Ist die 72-Zeichen abgeschnitten grundlegend für den Blowfish-Algorithmus, oder nur die PHP-Implementierung? IIRC Blowfish ist auch (zumindest einige) 'Nixen zum verschlüsseln der Kennwörter.
- Das Problem ist mit Bcrypt, nicht Blowfish. Ich kann das problem reproduzieren, mit Python und Bcrypt allein.
- Vielen Dank für Ihren Kommentar und Ihre Arbeit auf Sie. Ich konnte nicht finden, dass verschiedene Funktionen in php für blowfish und bcrypt, und obwohl Sie identisch sind. Aber macht es nicht einen Unterschied machen, der für mich in php? Ich würde es vorziehen, um die standard php-Funktion.
- Douglas, ja, die 72-Zeichen-Grenze ist von grundlegender Bedeutung, um BCrypt. Man könnte es verlängern (Extended DES crypt hierzu vs. Standard-DES zum Beispiel), aber es wäre flippig.
- Siehe auch Openwall ist PHP password hashing framework (PHPass). Seine tragbare und gehärtete gegen eine Reihe von gemeinsamen Angriffe auf Benutzer-Passwörter. Der Kerl, der schrieb das framework (SolarDesigner) ist der gleiche Kerl, der schrieb John-The-Ripper und sitzt als Richter in der Passwort-Hashing-Wettbewerb. Damit er weiß eine Sache oder zwei über Angriffe auf Passwörter.
- Bcrypt verwendet den Blowfish-Algorithmus hash-Passwörter. Daher können Sie nicht verwenden, bcrypt isoliert von Blowfish.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem hier ist im Grunde ein problem der Entropie. Beginnen wir also dort suchen:
Entropie Pro Zeichen
Die Anzahl der bits der Entropie pro byte:
So, wie wir handeln, hängt davon ab, welche Art von Zeichen, das wir erwarten.
Das Erste Problem
Das erste problem mit Ihrem code, ist, dass Ihr "Pfeffer" hash Schritt ist die Ausgabe von hex-Zeichen (da der vierte parameter
hash_hmac()
ist nicht gesetzt).Daher, die von der Vermischung Ihre Pfeffer auf, Sie sind effektiv schneiden der maximalen Entropie zur Verfügung, um das Passwort von einem Faktor 2 (aus 576 288 möglich bits).
Das Zweite Problem
Jedoch
sha256
nur256
bits der Entropie in den ersten Platz. So sind Sie effektiv schneiden eine mögliche 576 bit auf 256 bit. Ihre hash-Schritt * sofort*, per definition verliertmindestens 50% der möglich Entropie des Passworts.
Konnte Sie teilweise lösen diese durch den Wechsel zu
SHA512
, wo Sie würde nur eine Reduzierung der verfügbaren Entropie von etwa 12%. Aber das ist immer noch ein nicht unbedeutender Unterschied. Dass 12% reduziert die Anzahl der Permutationen mit einem Faktor von1.8e19
. Das ist eine große Nummer... Und das ist die Faktor es reduziert es durch...Das Zugrunde Liegende Problem
Das zugrunde liegende Problem ist, dass es drei Arten von Kennwörtern über 72 Charaktere. Die Auswirkungen, die dieser style-system hat auf Sie wird sehr unterschiedlich sein:
Hinweis: von hier aus gehe ich davon aus wir sind im Vergleich zu einem Pfeffer-system
SHA512
mit raw-Ausgabe (nicht hex).Hohe Entropie, zufällige Passwörter
Diese sind Ihre Benutzer mit Passwort-Generatoren, die zu generieren, was Zeit zu einem großen Schlüssel für die Passwörter. Sie sind zufällig (generiert, die kein Mensch gewählt), und haben eine hohe Entropie pro Zeichen. Diese Typen sind mit high-bytes (Zeichen > 127) und einige steuerzeichen.
Für diese Gruppe, Ihre Hash-Funktion wird deutlich reduzieren Sie Ihre verfügbaren Entropie in
bcrypt
.Lassen Sie mich sagen, dass wieder. Für Anwender, die mit hoher Entropie, lange Passwörter, Ihre Lösung deutlich reduziert die Stärke Ihres Passworts durch eine messbare Menge. (62 bits der Entropie verloren für eine 72-Zeichen-Passwort, und mehr, für längere Passwörter)
Medium der Entropie, zufällige Passwörter
Dieser Gruppe ist die Verwendung von Passwörtern mit gemeinsamen Symbolen, aber keine high-bytes oder-Zeichen. Dies sind Ihre typable Passwörter.
Für diese Gruppe, Sie gehen zu leicht entsperren mehr Entropie (nicht erstellen, sondern damit mehr Entropie, um fit in den bcrypt-Passwort). Wenn ich sage etwas, meine ich leicht. Der break-even tritt auf, wenn Sie max aus den 512 bits, SHA512 hat. Also, der peak ist bei 78 Zeichen.
Lassen Sie mich sagen, dass wieder. Für diese Klasse von Passwörtern, Sie können nur speichern Sie eine zusätzliche 6 Zeichen, bevor Sie laufen von Entropie.
Niedrige Entropie nicht-zufällige Passwörter
Dies ist die Gruppe, die mit alpha-numerischen Zeichen, die wohl nicht zufällig generiert werden. So etwas wie eine Bibel zitieren, oder so. Diese Sätze haben rund 2,3 bit Entropie pro Zeichen.
Für diese Gruppe, können Sie deutlich entsperren mehr Entropie (nicht erstellen, sondern die es ermöglichen, mehr passen in die bcrypt Passwort-Eingabe), die von der Vermischung. Die Gewinnschwelle ist rund 223 Zeichen, bevor Sie laufen von Entropie.
Lassen Sie uns sagen, dass wieder. Für diese Klasse von Passwörtern, pre-hashing jeden Fall erhöht die Sicherheit erheblich.
Zurück Zu Der Realen Welt
Diese Art der Entropie-Berechnungen nicht wirklich wichtig, viel in der realen Welt. Was zählt, ist zu raten, die Entropie. Das ist, was direkt Auswirkungen, was die Angreifer tun können. Das ist, was Sie wünschen, zu maximieren.
Zwar gibt es wenig Forschung, die den Weg in guessing entropy, gibt es einige Punkte, die ich möchte darauf hinweisen.
Die Chancen, nach dem Zufallsprinzip erraten 72 richtige Zeichen in einer Zeile sind extrem gering. Sie sind eher zu gewinnen, der Powerball Lotterie-21-Zeiten, als diese Kollision... Das ist, wie groß eine Zahl, die wir sprechen.
Aber wir können nicht stolpern auf es statistisch. Im Fall der Sätze, die chance, die ersten 72 Zeichen dasselbe ist, eine ganze Menge größer als für ein zufälliges Kennwort. Aber es ist immer noch trivial gering (Sie sind wahrscheinlicher zu gewinnen, die Lotterie Powerball 5 mal, basierend auf 2.3 bits pro Zeichen).
Praktisch
Praktisch, es spielt eigentlich keine Rolle. Die Chancen, jemanden zu raten, die ersten 72 Zeichen rechts, wo der letztere einen signifikanten Unterschied so gering, dass es nicht Wert sich Gedanken über. Warum?
Nun, sagen wir, du nimmst einen Satz. Wenn die person, die den ersten 72 Zeichen richtig, Sie sind entweder wirklich glücklichen (wahrscheinlich nicht), oder es ist ein weit verbreiteter Satz. Wenn es eine Allgemeine phrase, die einzige variable ist, wie lange es zu machen.
Nehmen wir ein Beispiel. Nehmen wir ein Zitat aus der Bibel (nur weil es eine gemeinsame Quelle der lange text, nicht aus einem anderen Grund):
Dass 180 Zeichen. Der 73 Zeichen ist die
g
im zweitenneighbor's
. Wenn Sie Ahnen, dass viel, du bist wahrscheinlich nicht zu stoppen, beinei
, aber weiter mit dem rest des verses (denn das ist, wie das Passwort ist wahrscheinlich verwendet werden). Daher, Ihrer "hash" nicht viel hinzuzufügen.BTW: ich bin ABSOLUT NICHT dafür, mit einem Bibel-Zitat. In der Tat, genau das Gegenteil.
Abschluss
Du bist nicht wirklich zu helfen Menschen viel wer lange Passwörter, die von der Vermischung ersten. Einige Gruppen können Sie auf jeden Fall helfen. Einige können Sie auf jeden Fall verletzt.
Aber am Ende, nichts davon ist allzu bedeutend. Die zahlen, die wir beschäftigen, sind nur WEG zu hoch. Der Unterschied in der Entropie ist nicht zu viel.
Du bist besser dran verlassen bcrypt, wie es ist. Du bist eher zu vermasseln die hashing (buchstäblich, Sie haben es bereits getan, und Sie sind nicht die ersten, oder letzten, die diesen Fehler machen), als der Angriff, den Sie versuchen zu verhindern, dass passieren.
Den Schwerpunkt auf die Sicherung der rest der Seite. Und fügen Sie einen Passwort-Entropie-meter, um die Kennwort-Feld auf der Anmeldung angeben, Passwort Stärke (und zeigt an, wenn ein Kennwort überlangen, dass der Benutzer kann es ändern möchten)...
Das ist meine $0,02, mindestens (oder möglicherweise mehr als $0.02)...
So Weit Wie Mit Einem "Geheimnis" Pfeffer:
Gibt es praktisch keine Forschung in der Fütterung eine hash-Funktion in bcrypt. Daher ist unklar, am besten, wenn die Fütterung eine "gepfeffert" bcrypt-hash wird immer Ursache unbekannter Sicherheitslücken (wir wissen, tun
hash1(hash2($value))
aussetzen erhebliche Schwachstellen rund um Kollision Widerstand und preimage-Angriffe).Wenn man bedenkt, dass Sie bereits über die Speicherung eines geheimen Schlüssels (der "Pfeffer"), warum nicht verwenden es in einer Weise, die gut untersucht und verstanden? Warum nicht verschlüsseln des hash vor, um es zu speichern?
Grundsätzlich, nachdem Sie das Kennwort gehasht, füttern, das ganze hash-Ausgabe in eine starke Verschlüsselungs-Algorithmus. Dann speichern Sie das verschlüsselte Ergebnis.
Nun eine SQL-Injection-Angriff wird nicht Auslaufen, etwas nützliches, da Sie nicht über die Ziffer-Taste. Und wenn der Schlüssel zugespielt, die Angreifer sind nicht besser dran, als wenn Sie einen einfachen hash (was nachweisbar ist, etwas mit dem Pfeffer "pre-hash" nicht).
Hinweis: wenn Sie wählen, dies zu tun, verwenden Sie eine Bibliothek. Für PHP, ich stark empfehlen Zend Framework 2
Zend\Crypt
Paket. Es ist eigentlich die einzige, die ich empfehlen würde, an diesem aktuellen Punkt in der Zeit. Es wurde stark überarbeitet, und es trifft alle Entscheidungen für Sie (das ist eine sehr gute Sache)...Etwas wie:
Und es ist von Vorteil, weil man alle algorithmen in einer Weise, die gut verstanden werden und gut untersucht sind (relativ zumindest). Denken Sie daran:
Würzen Passwörter ist sicherlich eine gute Sache zu tun, aber lasst uns sehen, warum.
Zuerst sollten wir die Frage beantworten, Wann genau eine Pfeffer hilft. Die Pfeffer-schützt nur die Passwörter, solange bleibt es geheim, so dass, wenn ein Angreifer Zugriff auf den server selbst, es ist von keinerlei nutzen. Viel leichter anzugreifen ist aber SQL-injection, die es erlaubt lese-Zugriff auf die Datenbank (für unsere hash-Werte), bereitete ich eine demo von SQL-injection zu zeigen, wie einfach es sein kann (klicken Sie auf den Pfeil, um einen vorbereiteten input).
Dann was macht der Pfeffer wirklich helfen? Solange der Pfeffer bleibt geheim, es schützt die schwachen Passwörter aus einem Wörterbuch-Angriff. Das Passwort
1234
würde sich dann so etwas wie1234-p*deDIUZeRweretWy+.O
. Dieses Kennwort ist nicht nur viel mehr, es enthält auch Sonderzeichen und wird nie ein Teil von jedem Wörterbuch.Nun können wir abschätzen, welche Passwörter unserer Benutzer verwenden, werden vermutlich mehr Benutzer eingeben werden, schwache Passwörter zu, da es Benutzer mit Kennwörtern zwischen 64-72 Zeichen (eigentlich sehr selten).
Weiterer Punkt ist der Bereich für brute-forcing. Der sha256-hash-Funktion zurückgeben 256 bit Ausgang oder 1.2E77 Kombinationen, dass die Wege viel zu viel für brute-forcing, auch für GPU ' s (wenn ich richtig berechnet, dies müsste über 2E61 Jahren auf eine GPU in 2013). So bekommen wir nicht wirklich ein Nachteil der Anwendung der Pfeffer. Da die hash-Werte sind nicht systematisch können Sie nicht beschleunigen, brute-forcing mit gemeinsamen Muster.
P. S. soweit ich weiß, die 72 Zeichen begrenzt ist spezifisch für den Algorithmus BCrypt selbst. Die beste Antwort, die ich fand, ist diese.
P. P. S ich denke, dein Beispiel ist fehlerhaft, man kann nicht generiert den hash mit der vollen Länge des Passworts und überprüfen Sie es mit einer verkürzten ein. Sie meinte wahrscheinlich gelten die Paprika der gleichen Weise für die Erzeugung des hash-und für die überprüfung des hash.
true
. Das ist es, was diese Frage ist alles über. Seht selbst: viper-7.com/RLKFnBBcrypt verwendet einen Algorithmus, basierend auf der teuren Blowfish-key-setup-Algorithmus.
Den empfohlenen 56-byte-Passwort-Grenzwert (einschließlich der null-Terminierung-byte) für bcrypt bezieht sich auf die 448-bit-Grenze der Blowfish-key. Alle bytes, die über diese Grenze nicht vollständig gemischt in den resultierenden Hashwert. Die 72 byte absolute limit auf bcrypt-Passwörter ist daher weniger relevant, wenn Sie den tatsächlichen Einfluss auf den resultierenden hash durch diese bytes.
Wenn Sie denken, dass Ihre Benutzer normalerweise wählen Sie Kennwörter über 55 bytes lang ist, denken Sie daran, Sie können immer erhöhen die Runden Kennwort ein stretching statt, zur Erhöhung der Sicherheit im Falle eines Passwort-Tabelle der Verletzung (obwohl diese eine Menge im Vergleich mit dem hinzufügen von zusätzlichen Zeichen). Wenn die Zugriffsrechte der Benutzer sind so kritisch, dass Nutzer in der Regel erfordern würde einen Massiv langen Passwort ein, dann das Passwort-Ablauf sollte auch kurz sein, z.B. 2 Wochen. Dies bedeutet, dass ein Passwort ist viel weniger wahrscheinlich ist, gültig bleiben, während ein hacker investiert Ihre Ressourcen in das besiegen der Arbeit Faktor bei der Prüfung jeder Versuch das Passwort zu sehen, ob es einen passenden hash.
Natürlich, im Falle der Passwort-Tabelle nicht verletzt werden, sollten wir nur Hackern erlaubt, höchstens zehn versuchen zu erraten eines Benutzers 55 byte-Passwort, bevor Sie sperren das Konto des Benutzers aus 😉
Wenn Sie sich entschließen, pre-hash ein Passwort, das mehr als 55 bytes, dann sollten Sie verwenden, SHA-384, da es die größte Ausgabe, ohne über die Grenze.