У меня было что-то вроде этого (скопировано с http://www.gregboggs.com/php-blowfish-random-salted-passwords/)
$Blowfish_Pre = '$2a$05$';
$Blowfish_End = '$';
$bcrypt_salt = $Blowfish_Pre . $salt . $Blowfish_End;
$hashed_password = crypt($password, $bcrypt_salt);
echo $salt . '<br>';
echo $password . '<br>';
echo $bcrypt_salt . '<br>';
echo $hashed_password . '<br>';
echo "end";
Когда я запускаю тест, получается, что значение $hashed_password
точно так же, как $bcrypt_salt
, в то время как $salt
, $password
, а также $bcrypt_salt
все возвращаемые значения, как и ожидалось. Как это исправить?
Извините, это было неправильно: «05 $» в «pre» — это слишком много. Попробуй без.
Руководство (http://php.net/manual/en/function.crypt.php) говорит:
CRYPT_BLOWFISH — хеширование Blowfish с солью следующим образом: «$ 2a $»,
«$ 2x $» или «$ 2y $», двухзначный параметр стоимости, «$» и 22 символа
из алфавита «./0-9A-Za-z».
Использование такой соляной работы длиной 22 символа:
echo crypt('secret', '$2a$05$1234567890123456789012$');
$2a$05$123456789012345678901u.97m5mwuxOR3RvRKYm9sasohx5Mnzwq
Всегда используйте случайный хеш, выше был только пример!
Если вам не нужна версия «2a» для blowfish, я бы рекомендовал использовать следующее, поскольку оно совместимо с crypt () и генерирует случайную соль:
echo password_hash("secret", PASSWORD_BCRYPT);
П.С .: При чтении подобных вещей в руководстве я бы рекомендовал вообще больше не использовать PHP. Разве они не могут просто генерировать исключение, как любой другой вменяемый API?
Использование символов за пределами этого диапазона в соли вызовет crypt ()
вернуть строку нулевой длины.
Других решений пока нет …