Krypta für Passwort-Hashing. Blowfish erzeugt eine seltsame Ausgabe

Ich habe ein bisschen Probleme, die Crypt-Funktion von PHP zu verstehen. Meine PHP-Version ist 5.4.7.

Ich möchte Crypt verwenden, um gesalzene Passwörter in der Datenbank zu speichern, da Entwickler, die md5 zum Hashing von Passwörtern verwenden, meines Erachtens sofort gesteckt und gebrannt werden sollen.

Ich wollte den Blowfish-Alg verwenden, um den Hash zu generieren. Laut der PHP-Dokumentation verwendet Crypt nun Blowfish, wenn Sie es mit "$ 2y $2$quot; + cost (zum Beispiel: "08") + "$2$quot; + 22 Zeichen salt (./0-9A-Za-z) aufrufen. . Die Ausgabe dieses kleinen Testcodes verwirrt mich jedoch:

echo "<pre>";
if (CRYPT_BLOWFISH == 1) {
    echo 'Blowfish SaltLen = 18:     ' . crypt('string that should be hashed', '$2y$08$123456789012345678') . "\n";
    echo 'Blowfish SaltLen = 19:     ' . crypt('string that should be hashed', '$2y$08$1234567890123456789') . "\n";
    echo 'Blowfish SaltLen = 20:     ' . crypt('string that should be hashed', '$2y$08$12345678901234567890') . "\n";
    echo 'Blowfish SaltLen = 21:     ' . crypt('string that should be hashed', '$2y$08$123456789012345678901') . "\n";
    echo 'Blowfish SaltLen = 22:     ' . crypt('string that should be hashed', '$2y$08$1234567890123456789012') . "\n";
}
echo "</pre>";

Ausgabe:

Blowfish SaltLen = 18:     $2y$08$123456789012345678$$.Gq4WBozZb6XYmOJ88OC8gThSTUx8pRO
Blowfish SaltLen = 19:     $2y$08$1234567890123456789$.u8Qm7Q9KVtvo2zwpKkN5ntAxu71k2pO
Blowfish SaltLen = 20:     $2y$08$12345678901234567890$.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu
Blowfish SaltLen = 21:     $2y$08$123456789012345678901.iIlIFEGaqDj6XbnKkK1F14HmMGLV.mu
Blowfish SaltLen = 22:     $2y$08$123456789012345678901uSFz9yPi/jA6e9aMcUkm7y.TJYhcCoSu

Die scheinbare Krypta füllt das Salz mit $, wenn es nicht lang genug ist. Das Salz ändert sich und der Hasch. Die Ausgabe in Zeile 1 und 2 ist also wie erwartet.

Was mich jedoch verwundert, sind die letzten drei Hashes: Anscheinend trennt der Punkt den Hash vom Salt (?), Aber wenn Sie die 22 Zeichen, die er als Salt fordert, tatsächlich verschlüsseln, verschwindet der Dot. Außerdem wird das letzte Zeichen aus dem Salt nicht in der Ausgabe angezeigt, sondern ändert den Hash im Vergleich zum 21-Zeichen-Salt.

Besonders verwirrend sind die Zeilen 3 und 4 in der Ausgabe! Das Salz ist offensichtlich anders, aber die Hashes sind genau gleich. Ich sehe darin einfach keine Konsequenz und würde mich über Hilfe sehr freuen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage