Я использую UserCake и столкнулся с проблемой. По какой-то причине generateHash()
функция больше не работает последовательно. Вот что я смотрю на:
funcs.php <- Где проводится функция
function generateHash($plainText, $salt = null) {
if ($salt === null) {
$salt = substr(md5(uniqid(rand(), true)), 0, 25);
} else {
$salt = substr($salt, 0, 25);
}
return $salt . sha1($salt . $plainText);
}
class.newuser.php <- где вызывается функция для создания пароля
//Construct a secure hash for the plain text password
$secure_pass = generateHash($this->clean_password);
login.php <- где вызывается функция для сравнения паролей
//Hash the password and use the salt from the database to compare the password.
$entered_pass = generateHash($password,$userdetails["password"]);
if($entered_pass != $userdetails["password"]) {
$errors[] = lang("ACCOUNT_USER_OR_PASS_INVALID");
} else {
//Passwords match! we're good to go'
}
Я могу успешно создать новую учетную запись. Но когда я захожу, чтобы войти в систему, пароль хеша, созданный login.php, отличается от пароля, созданного новым классом пользователя. Например, когда я вхожу, я ставлю print_r
как для введенного хеша pw, так и для хеша pw в базе данных, и вот что возвращается:
$entered_pass = 62b8ce100193434601929323a13a4d95bd3c6535b014e6444516af13f605f36f7
database pass = 62b8ce100193434601929323a153564aaeb4ad75d57b353ee8918cd9829cb5e1b
Единственное, о чем я могу думать, это то, что хешированный пароль начинает отклоняться от 26-го символа, а $salt
похоже, что что-то происходит с 25 (при условии, что это максимальная длина?). Все это стандартный пользовательский материал, поэтому я не понимаю, почему он так непоследователен.
Отмечу, если скопирую хешированный $entered_pass
(первый там) и вставьте его в базу данных, я успешно войду в систему.
РЕДАКТИРОВАТЬ >>>
Посмотрев на это еще немного, я думаю, что проблема сводится к sha1($salt . $plainText);
, Похоже, после первого $salt
где вещи начинают отличаться. Также, когда я удаляю sha1()
Функция, она входит в систему отлично, мне просто интересно, если это имеет какое-либо существенное влияние на безопасность.
У меня была такая же проблема. После некоторых исследований я обнаружил, что использование функции password_hash () более актуально.
Я изменил переменную $ secure_pass в class.newuser.php к этому…
//Construct a secure hash for the plain text password
$secure_pass = password_hash("$this->clean_password", PASSWORD_DEFAULT);
class.user.php
//Update a users password
public function updatePassword($pass)
{
global $mysqli,$db_table_prefix;
$secure_pass = password_hash("$pass", PASSWORD_DEFAULT);
$this->hash_pw = $secure_pass;
$stmt = $mysqli->prepare("UPDATE ".$db_table_prefix."users
SET
password = ?
WHERE
id = ?");
$stmt->bind_param("si", $secure_pass, $this->user_id);
$stmt->execute();
$stmt->close();
}
login.php
// Use built in PHP password hashing
if (!password_verify($password, $userdetails["password"])) {
// Login Error Attempt Handler
login_attm_hand();
//Again, we know the password is at fault here, but lets not give away the combination incase of someone bruteforcing
$errors[] = lang("ACCOUNT_USER_OR_PASS_INVALID");
}
Я думаю, что это все, что мне нужно было обновить на моем сайте. Если у вас есть какие-либо ошибки, дайте мне знать, и я постараюсь помочь.
Других решений пока нет …