Bevor wir beginnen: Ja ich weiß, dass ich password_hash
PHP-Funktion verwenden sollten, wenn tatsächlich Passwörter zu speichern. Dies ist eine Frage über die Interna des PHP-Hashing-Systems.PHP bcrypt Uneinheitliche Salz
Also habe ich neulich mit PHP crypt
Funktion rumspielen, und ich bemerkte ein seltsames Verhalten mit bcrypt.
$password = "totallyagoodpassword";
$salt = "hereisa22charactersalt";
$parameter = '$2y$10$' . $salt;
echo $parameter . PHP_EOL;
echo crypt($password, $parameter);
Nach PHP's manual, sollte dieser Code Hash "totallyagoodpassword
" bcrypt mit, Salzen mit "hereisa22charactersalt
." Die Ausgabe dieses Hash sollte das Schema sein ("$2y$10$
"), gefolgt von den 22 Zeichen des Salzes, gefolgt von 31 Zeichen Hash. Daher sollte ich "$2y$10$hereisa22charactersalt
" und dann 31 Zeichen von zufälligen base64 Zeichen erwarten.
So betreibe ich den Code:
$2y$10$hereisa22charactersalt
$2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG
Und ich kann nicht umhin zu bemerken, wie das Salz I in crypt
geleitet, und das Salz, das aus kam nicht gleich sind; Insbesondere wurde der allerletzte Charakter auf magische Weise zu einem "e
". Nachdem ich dies mit verschiedenen Salzen ausgeführt habe, bekomme ich immer noch die gleiche Eigenart, wo das letzte und einzige letzte Zeichen des Ausgabe-Hashes unterschiedlich ist.
Ich bin kein Entwickler für PHP, also bin ich mir sicher, dass hinter diesem Verhalten eine gewisse Logik steckt. Aber ich bin neugierig.
Der größte Teil der Forschung, die ich auf bcrypt scheinen zu zeigen, getan haben, dass das Salz 128 Bits ist, die, wenn sie in base64 (ohne Berücksichtigung padding) codiert sind, machen bis 22 Zeichen. Es macht für mich keinen Sinn, dass PHP 22 Zeichen benötigt und dann nicht alle benutzt. Auch ich habe versucht mit und ohne die endgültige "$" und es schien keinen Unterschied zu machen. – Kilo