Генерация случайной соли и использование ее в Bcrypt

Я пытаюсь создать случайную соль для хеширования пароля. Я немного новичок в хешировании паролей, но, насколько я понимаю, при использовании алгоритма BCrypt вы получите хеш-строку длиной 60 символов.

22 символа. Из этих 60 символов должно быть значение соли, которое добавляется к полученному хешу.

Я использовал простой код, чтобы убедиться, что случайно сгенерированная соль - это та же самая, которая будет добавлена ​​к фактическому хешу:

$salt = substr(strtr(base64_encode(openssl_random_pseudo_bytes(22)), '+', '.'), 0, 22);
echo "Salt Value is: ".$salt . "\n";

Вывод был: Значение соли: XKFB8DHMiXaYTzRAHtRhX7

Затем я зашифровал пароль, используя ту же сгенерированную соль, как показано ниже:

$cost = 8; 
$EncryptedPassword = password_hash($Password, PASSWORD_BCRYPT, ['cost' => $cost,'salt' => $salt]);
echo "Encrypted Password: " . $EncryptedPassword . "\n";

Результат оказался не таким, как я ожидал:

Зашифрованный формат: $2y$10$XKFB8DHMiXaYTzRAHtRhXutlLLG8XIZjj5XGeyoUZobEtnkOn/M/S Где результирующая соль не совсем та, которую я использовал для хеширования, то есть последний символ значения соли всегда отличается.

Случайно генерируемая соль: XKFB8DHMiXaYTzRAHtRhX7

Полученное значение соли: XKFB8DHMiXaYTzRAHtRhXu

Мой вопрос заключается в том, в чем может быть проблема, и как я могу получить одно и то же случайно сгенерированное солт-значение, встроенное в строку хэша пароля, не меняя его?

1 ответ

Решение

Проще и безопаснее просто использовать password_hash() и сопутствующий password_verify() для PHP.

Используйте алгоритм CRYPT_BLOWFISH для создания хэша. Это создаст стандартный хеш, совместимый с crypt(), использующий идентификатор "$2y$".

Не нужно добавлять соль, и лучше ее не поставлять, в PHP 7.x опция соли была удалена.

Пример: password_hash("aPassword", PASSWORD_BCRYPT)

Другие вопросы по тегам