Cripta para el hashing de contraseña. Blowfish produce salida extraña

Estoy teniendo algunos problemas para entender la función de cripta de php. Mi versión de PHP es 5.4.7.

Quiero usar crypt para almacenar contraseñas saladas en la base de datos, porque, según me han dicho, los desarrolladores que usan md5 para hacer hash de las contraseñas deben ser replanteados y grabados en el momento.

Quería utilizar el alg de pez globo para generar el hash. Ahora, de acuerdo con la documentación de php, crypt usa blowfish si lo llama con "$ 2y $2$quot; + costo (por ejemplo: "08") + "$2$quot; + 22 caracteres salt (./0-9A-Za-z) . Sin embargo, la salida de este pequeño código de prueba me confunde:

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>";

Salida:

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

La cripta aparentemente llena la sal con $ si no es lo suficientemente larga. La sal cambia y también lo hace el hachís. Así que la salida en la línea 1 y 2 es la esperada.

Sin embargo, lo que me desconcierta son los últimos tres hash: al parecer, el punto separa el hash de la sal (?), Pero si realmente le asignas a la cripta los 22 caracteres que exige como sal, el punto desaparece. Además, el último carácter de la sal no aparece en la salida, pero cambia el hash en comparación con la sal de 21 caracteres.

¡Lo que es especialmente confuso es la línea 3 y 4 en la salida! La sal es obviamente diferente, pero los hashes son exactamente iguales. Simplemente no puedo ver ninguna consistencia en esto y agradecería enormemente la ayuda.

Respuestas a la pregunta(1)

Su respuesta a la pregunta