Прежде чем мы начнем: Да, я знаю, что должен использовать функцию 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, поэтому я уверен, что в этом поведении есть какая-то логика. Но мне любопытно.