пароли — PHP-крипта не совпадает правильно

Я пытаюсь использовать 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

Так что, похоже, соль совпадает, но хэш пароля по какой-то причине не совпадает.

Кто-нибудь может пролить свет? Благодарю.

0

Решение

У вас есть две ошибки в вашем 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 тоже. Лучше использовать расширение пароля, где уже реализовано создание соли.

0

Другие решения

Сгенерированное хеш-значение в вашем verify_password() Функция генерирует действительный хеш BCrypt с теми же параметрами и той же солью, что и сохраненное хеш-значение. Это на самом деле оставляет только альтернативу, что входы разные $userinput['password'] != $input_password,

В любом случае, очень вероятно, что вы можете использовать новую функцию password_hash (), и я бы порекомендовал это сделать. Eсть пакет совместимости доступно для версии PHP 5.3.7 и выше. Даже с 5.3 можно использовать его с небольшой переделкой.

0

По вопросам рекламы [email protected]