Я пытаюсь использовать PHP crypt () для создания базовой схемы хеширования / проверки пароля. Я не могу перейти на PHP 5.5.0 прямо сейчас, поэтому я не могу использовать password_hash () и password_verify ().
Мой код выглядит следующим образом:
function myinit_salt()
{
$options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
for ($i = 0; $i <= 20; $i ++) {
$options = str_shuffle ( $options );
$salt .= $options [rand ( 0, 63 )];
}
return $salt;
}
… (шифрование предоставленного пользователем пароля при регистрации) …
$salt = myinit_salt();
$blowfish = '$2a$10$';
$enc_pw = crypt($userinput['password'], $blowfish . $salt);
… (сохранить зашифрованный пароль в базе данных) …
… (проверка сохраненного пароля по предоставленному пользователем паролю при попытке входа в систему) …
function verify_password($input_password, $db_password)
{
if ($input_password) {
if (crypt($input_password, $db_password) == $db_password) {
//authenticated
return true;
} else return false;
} else return false;
}
Это возвращало ложь, даже если предоставленные пользователем пароли совпадают. Таким образом, я заставил verify_password () выложить значения, которые он использовал, и вот что было дано:
предоставленный пользователем пароль ($ input_password) = abcxyz123
$ db_password = $ 2a $ 10 $ y / WXEmlCb6392Wpf8FMpq.FuwwnaSU51x / xPdFYlTl5y6Bsn51Nzi
verify_password () crypt hash = $ 2a $ 10 $ y / WXEmlCb6392Wpf8FMpq.s8Y6lrJGDMOAJ4d8GffQUEiAWKsEyqS
Так что, похоже, соль совпадает, но хэш пароля по какой-то причине не совпадает.
Кто-нибудь может пролить свет? Благодарю.
У вас есть две ошибки в вашем myinit_salt
function myinit_salt()
{
$options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$salt = ''; // without it notice would be raised
// v
for ($i = 0; $i <= 21; $i ++) { // <--- length of salt should be 22
// ^
$options = str_shuffle ( $options );
$salt .= $options [rand ( 0, 63 )];
}
return $salt;
}
http://php.net/manual/en/function.crypt.php
Постскриптум Почему не использовать пароль расширение php?
P.S.S. Не создавайте свою собственную функцию генерации соли. str_shuffle
— не является безопасным для функций склепа. mt_rand
тоже. Лучше использовать расширение пароля, где уже реализовано создание соли.
Сгенерированное хеш-значение в вашем verify_password()
Функция генерирует действительный хеш BCrypt с теми же параметрами и той же солью, что и сохраненное хеш-значение. Это на самом деле оставляет только альтернативу, что входы разные $userinput['password'] != $input_password
,
В любом случае, очень вероятно, что вы можете использовать новую функцию password_hash (), и я бы порекомендовал это сделать. Eсть пакет совместимости доступно для версии PHP 5.3.7 и выше. Даже с 5.3 можно использовать его с небольшой переделкой.