У меня есть немного немного проблем с пониманием функции php crypt. Моя версия PHP - 5.4.7.
Я хочу использовать crypt для хранения соленых паролей в базе данных, потому что, насколько мне известно, разработчики, которые используют md5 для хэш-паролей, должны быть скопированы и сожжены на месте.
Я хотел использовать мусорный напиток для генерации хэша. Теперь, согласно документации php, crypt использует blowfish, если вы называете его "$ 2y $" + стоимость (например: "08" ) + "$" + 22 символа salt (./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 в выходе! Соль, очевидно, отличается, но хеши точно такие же. Я просто не вижу никакой согласованности в этом и очень ценю помощь.