Скрипт для хеширования пароля. Blowfish производит странный вывод

У меня возникли небольшие проблемы с пониманием функции php crypt. Моя версия PHP 5.4.7.

Я хочу использовать crypt для хранения соленых паролей в базе данных, потому что, как мне говорят, разработчики, использующие md5 для хэширования паролей, должны быть поставлены на карту и записаны на месте.

Я хотел использовать alg blowfish для генерации хеша. Теперь, согласно документации php, crypt использует blowfish, если вы вызываете его с «$ 2y $» + стоимость (например: «08») + «$» + 22 символа соли (./0-9A-Za-z) , Тем не менее, вывод этого небольшого кусочка тестового кода сбивает меня с толку:

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

Выход:

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

Очевидно, склеп заполняет соль $, если она недостаточно длинная. Соль меняется, как и хэш. Таким образом, выходные данные в строках 1 и 2 соответствуют ожидаемым.

Однако меня озадачивают последние три хэша: очевидно, точка отделяет хеш от соли (?), Но если вы фактически дадите крипте 22 символа, которые она требует в качестве соли, точка исчезнет. Кроме того, последний символ из соли не появляется в выходных данных, но меняет хеш по сравнению с 21-символьной солью.

Что особенно сбивает с толку, так это строки 3 и 4 на выходе! Соль, очевидно, другая, но хеш точно такой же. Я просто не вижу никакой последовательности в этом и буду очень признателен за помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос