Cripta por hashing de senha. Blowfish produz uma saída estranha

Estou tendo um pouco de dificuldade em entender a função cryp do php. Minha versão do PHP é 5.4.7.

Eu quero usar criptografia para armazenar senhas salgadas no banco de dados, porque, até onde me disseram, os desenvolvedores que usam md5 para hash senhas devem ser apostados e queimados no local.

Eu queria usar o algarismo blowfish para gerar o hash. Agora, de acordo com a documentação do php, o crypt usa blowfish se você chamá-lo com "$ 2y $2$quot; + custo (por exemplo: "08") + "$2$quot; + 22 caracteres sal (./0-9A-Za-z) . No entanto, a saída desse pequeno código de teste está me confundindo:

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

Saída:

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

A aparentemente cripta enche o sal com $, se não for comprido o suficiente. O sal muda e o mesmo acontece com o hash. Portanto, a saída na linha 1 e 2 é conforme o esperado.

O que está me intrigando, no entanto, são os últimos três hashes: Aparentemente, o ponto separa o hash do sal (?), Mas se você realmente der à cripta os 22 caracteres que ele exige como sal, o ponto desaparece. Além disso, o último caractere do salt não aparece na saída, mas altera o hash comparado ao sal de 21 caracteres.

O que é especialmente confuso é a linha 3 e 4 na saída! O sal é obviamente diferente, mas os hashes são exatamente os mesmos. Eu simplesmente não consigo ver nenhuma consistência nisso e agradeço muito a ajuda.

questionAnswers(1)

yourAnswerToTheQuestion