crypt && CRYPT_BLOWFISH. длинна соли 21 и 22 симола, не понятная разница

iamFake

Mind Of Liberty
Здравствуйте.

Столкнулся с непонятным поведением функции crypt:

PHP:
$salt = '$2y$15$f3a6d962b16962451072f7';
$hash = crypt('Some string', $salt);
в результате я получаю вот такой хеш

$2y$15$f3a6d962b16962451072fuDG5OMnGompPuRjK.uq9NHCqjRHhTNbe

Данный хеш содержит также ранее сгенерированную соль... кроме её последнего символа (цифра 7), т.е. "как бы" опускает её в выводе, но при проверке результаты совпадают.

Если последнюю цифру убрать(т.е. соль становится 21 символ, а не 22) - "исходная соль" и "получаемая" становятся идентичны, но результат хеширования строки разный:

PHP:
$str = 'Some string';
$salt = '$2y$15$f3a6d962b16962451072f';
$hash1 = crypt($str, $salt); //получаем хеш
$hash2 = crypt($str,$hash1);//проверяем
// $hash1 = $2y$15$f3a6d962b16962451072f.V6V20R/1FV9zVIviykwPI0Cw4NgAi8y
// $hash2 = $2y$15$f3a6d962b16962451072f.58loOt/0wdW2lJ.hNYoCkogpaYXy4wC
Если соль до 20 включительно или 22 символа - все отлично, но при 21 символе "косяк"...

Из документации знаю, что надо 22 символа, но если скажем поставить 10 символов - то функция сама "добьет" соль до 21 символа "баксами" (символ $), но если я ей отдаю 21 то поведение отличается от ожидаемого. Получается это баг?

php 5.4.4 linux
 

MiksIr

miksir@home:~$
Там соль - это 128 бит закодированные в base64. У последнего символа, насколько я помню, не все биты с информацией (128 % 6 = 2, да два бита и 6), а остальные должны быть нулевые. По-этому последний символ соли и претерпевает изменения.
А вот второй пример... ну похоже на баг.
 
Сверху