Некоторое время назад я написал этот код, который сейчас оживляю для нового проекта, но он, похоже, не работает, и я не могу на всю жизнь понять, почему он не будет проверять хэш.
Ниже приведены 2 функции, которые выполняются при регистрации первой функции passwordEncrypt ().
При попытке входа в систему вызывается функция checkPassword (), вместо того, чтобы войти в систему и повторить «да», он попадает в раздел, где он отображает «нет».
Поэтому, пожалуйста, если свежий взгляд может взглянуть заранее, большое спасибо!
// Encrypt user password
function passwordEncrypt($password) {
// set the salt
$salt = substr(md5(time()), 0, 22);
// encrypt using blowfish with a load of 10
$password = crypt($password, '$2a$10$' . $salt);
// return the encrypted hash
return $password;
}
/*
Check password function when logging in
first we select the password from the supplied username from the database
// get the row and set the hash to the currect password from the database
//run the salts etc and check to see if the passwords match
*/
function checkPassword($userName, $password, $db){
$sql = 'SELECT password FROM users WHERE userName = :userName';
$stmt = $db->prepare($sql);
$stmt->bindValue(':userName', $userName, PDO::PARAM_STR);
$stmt->execute();
$numRows = $stmt->rowCount();
if ($numRows > 0) {
$row = $stmt->fetch();
$hash = $row['password'];
// run the hash function on $password
$fullSalt = substr($hash, 0, 29);
$new_hash = crypt($password, $fullSalt);
// Check that the password matches
if($hash == $new_hash) {
echo 'yes';
exit;
return true;
} else {
echo 'no';
exit;
return false;
}
} else {
echo 'way';
exit;
return false;
}
}
Я зарегистрировал пароль, а затем попробовал его, и это то, что он возвращает
Пароль: $ 2a $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9
Введено: $ 2a $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa
нет
Так это добавление на hapWU3lYxlg3AAa
«Длина столбца — это то, что? 40? 50? 60? другое? $ 2a $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9 означает, что он слишком короткий. — Фред -ii-«
а также
«Ах 45 в базе данных — Том С»
Вот и ты. Длина столбца слишком короткая и должна быть 60.
Руководство предлагает 255.
Небольшая коррекция: 255 это то, что руководство по password_hash()
предлагает использовать. Тем не менее, было бы лучше всего использовать 255 для того, что руководство также предлагает иметь в виду на будущее и считает, что это «хороший выбор».
Вам нужно очистить строки, изменить столбец на 60 или больше, затем создать новый хэш и снова войти в систему.
$ 2a $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa
60 лет
Примечания:
Говорят, что некоторым трудно работать с crypt()
и используя password_hash()
или пакет совместимости (если PHP < 5,5) https://github.com/ircmaxell/password_compat/ на самом деле проще. Выбор за вами.
Смотрите это Q&А на стеке также:
Других решений пока нет …