Похоже, вы неправильно поняли соли, поскольку вы устанавливаете $salt
в качестве пароля.
Соль должна быть полностью случайной строкой, которая хранится в записи пользователя вместе с хэшем пароля. Новая уникальная соль должна генерироваться для каждого пользователя. Поэтому вам нужно добавить в вашу базу данных новый столбец с именем «password_salt» или аналогичным.
Вместо того, чтобы пытаться использовать пароль в запросе SELECT
и посмотреть, есть ли у вас какие-либо записи, вам на самом деле нужно просто SELECT
, используя username / user_id, чтобы получить хеш и соль пароля, чтобы вы могли затем используйте их, чтобы определить, правильно ли пользователь ввел пароль.
Когда вы регистрируете новых пользователей, вы должны добавить поля с такими значениями, как
<?php
// This is registeruser.php
$salt = substr(sha1(uniqid(rand(), true)), 0, 20);
$pass = $_POST['password'];
$pass_to_store = hash("sha256", $salt.$pass);
// Then issue a DB query to store the $salt and $pass_to_store in the user record.
// Do not store $pass, you don't need it.
// e.g. INSERT INTO users ('username', 'password_salt', 'password_hash') VALUES (:username, :salt, :pass_to_store);
?>
Затем для проверки пароля остается тем же при входе в систему, вы делаете что-то вроде этого,
<?php
// This is loginuser.php
$user = // result from SQL query to retrieve user record
// e.g. SELECT password_hash, password_salt FROM users WHERE username='from_user'
$salt_from_db = $user['password_salt'];
$pass_from_db = $user['password_hash'];
if ($pass_from_db == hash("sha256", $salt_from_db.$_POST['password'])
{
// Password matches!
}
?>
Не забудьте очистить вводимые пользователем данные и все, что вы помещаете в свою базу данных. Возможно, вы захотите использовать подготовленные операторы вместо того, чтобы постоянно помнить о mysql_real_escape_string
.