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.

Schreibe einen Kommentar