Генерация случайной соли и использование ее в 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)