Несовместимая соль PHP bcrypt

Прежде чем мы начнем: Да, я знаю, что должен использовать функцию PHP password_hash при фактическом сохранении паролей. Это вопрос о внутреннем устройстве системы хеширования PHP.

Итак, на днях я возился с функцией PHP crypt и заметил странное поведение с bcrypt.

$password = "totallyagoodpassword";
$salt = "hereisa22charactersalt";

$parameter = '$2y$10$' . $salt;

echo $parameter . PHP_EOL;
echo crypt($password, $parameter);

Согласно руководству по PHP, этот код должен хешировать "totallyagoodpassword" с помощью bcrypt, добавив к нему "hereisa22charactersalt". Результатом этого хеша должна быть схема ("$2y$10$"), за которой следуют 22 символа соли, а затем 31 символ хеша. Поэтому я должен ожидать «$2y$10$hereisa22charactersalt», а затем 31 случайный символ base64.

Итак, я запускаю код:

$2y$10$hereisa22charactersalt
$2y$10$hereisa22charactersalev7uylkfHc.RuyCP9EG4my7WwDMKGRvG

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

Я не разработчик PHP, поэтому я уверен, что в этом поведении есть какая-то логика. Но мне любопытно.


person Kilo    schedule 21.07.2016    source источник


Ответы (1)


В документах не указано, что вывод будет включать все 22 байта соли. Также пример в документации по криптографии показывает последний "$" в соли.

crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$')

Производство:

$2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

person zaph    schedule 21.07.2016
comment
Большинство исследований, которые я провел по bcrypt, похоже, указывают на то, что соль составляет 128 бит, что при кодировании в base64 (игнорируя заполнение) составляет 22 символа. Для меня действительно не имеет смысла, что PHP потребует 22 символа, а затем не будет использовать их все. Также я пробовал с окончательным $ и без него, и это, похоже, не имело никакого значения. - person Kilo; 21.07.2016