PHP SHA256 и Salt не будут работать

Я пытаюсь создать пароли, которые sha256 hashed с переменной $ salt. Но по какой-то причине это просто не сработает. На данный момент я работаю 3 часа, и я собираюсь сорвать голову. Вот мой код:

Я попробую еще раз, извините, o)

Хорошо, мой скрипт работал нормально, пока я не попытался добавить sha256 к паролям. У меня есть файл для создания пользователей, который:

$salt = "lollol"; $password = hash('sha256', $salt.$_POST['password']); $sql = ("INSERT INTO members (username, password, name, last_name,company)VALUES('$username', '$password', '$name', '$last_name', '$company')")or die(mysql_error()); if(mysql_query($sql)) echo "Your accuont has been created."; 

Кажется, он правильно добавлен в базу данных. Я вижу, что он получает хэшированные буквы и цифры.

Но тогда, когда я пытаюсь войти в систему, это просто не будет.

Мой код для login.php:

 $sql= "SELECT * FROM members WHERE username='$username' and password='$password'"; $result=mysql_query($sql); $row=mysql_fetch_array($result); $username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $salt = "lollol"; $auth_user = hash('sha256', $salt.$password); if($password == $salt.$auth_user){ echo "Logged in"; } else { echo "Not logged in"; } 

У меня есть идея, мне нужно зашифровать пароль, когда я хочу войти в систему, но я не уверен. Я надеюсь, что некоторые из вас могут мне помочь.

При попытке войти в систему вы снова объединяете хэш с солью

 $auth_user = hash('sha256', $salt.$password); if($password == $salt.$auth_user){ // <-- $salt once more echo "Logged in"; } else { echo "Not logged in"; } 

Он должен работать, если вы просто удалите его

 $auth_user = hash('sha256', $salt.$password); if($password == $auth_user){ echo "Logged in"; } else { echo "Not logged in"; } 

Обновление: продолжение

Вот

 $sql= "SELECT * FROM members WHERE username='$username' and password='$password'"; 

Вы пытаетесь получить строку, где username соответствует $username и пароль соответствует $password . В базе данных пароли уже хешированы (и $password похоже, вообще не определен), поэтому этот запрос никогда не вернет ни одну строку.

 $password = hash('sha256', $salt.$_POST['password']); $username = mysql_real_escape_string($_POST['username']); $sql= "SELECT * FROM members WHERE username='$username' and password='$password'"; $result=mysql_query($sql); 

$result теперь должен содержать только пользователя, который соответствует данным учетным данным. Его сейчас очень легко

 if (mysql_num_rows($result) === 1) { echo "Logged in"; } else { echo "Not logged in"; } 

Вы храните зашифрованный пароль, но ваш запрос выбора ищет незашифрованный пароль.

Просто получите совпадающее имя пользователя (без пароля) – имена пользователей уникальны, правильно?

 $sql= "SELECT * FROM members WHERE username='$username'"; $result=mysql_query($sql); $row=mysql_fetch_array($result); $username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $salt = "lollol"; $auth_user = hash('sha256', $salt.$password); if($row["password"] == $auth_user){ echo "Logged in"; } else { echo "Not logged in"; } 
 $password = $_POST['password']; // This should be the users actual salt after you've found the user // in the database by username or email, or other means $salt = $users_stored_salt; // This should be the exact method you use to salt passwords on creation // Consider creating a functon for it, you must use the same salt // on creation and on validation $hashed_password = hash('sha256', $salt.$password.$salt); // This is the user's hashed password, as stored in the database $stored_password = $users_stored_password; // We compare the two strings, as they should be the same if given the // same input and hashed the same way if ($stored_password === $hashed_password){ echo "Logged in"; } else { echo "Not logged in"; } 

Пропустил ваше редактирование, но надеюсь, что это поможет.

EDIT : Я вижу, вы не храните уникальные хэши.

Если вы ищете пользователя по паролю, вам необходимо ввести пароль в свой запрос так же, как он был сохранен:

 $salt = $your_salt; $hashed_password = hash('sha256', $salt.$_POST['password']); $sql= "SELECT * FROM members WHERE username='$username' and password='$hashed_password'"; 

В противном случае вы можете искать уникальное имя пользователя (а не по паролю) и просто сравнивать хешированный ввод со значением сохраненного пароля.

Я сейчас очень смущен. Как должен выглядеть мой login_ac.php, если я должен сделать это с кодом, который я дал вам в верхней части?

Просто измените запрос на поиск с помощью хэшированного пароля (так, как вы его сохранили).

 $sql= "SELECT * FROM members WHERE username='$username' and password='".hash('sha256', $salt.$_POST['password'])."'"; 

Вы можете удалить другую проверку и хеширование – если вы нашли пользователя, то вы знаете, что вход действителен.

Обратите внимание, что это работает только тогда, когда вы знаете, как вы хешируете ввод, точно так же, как вы создали пароль при создании.

Стоит проверить, что длина поля в базе данных достаточно велика, чтобы хранить весь хешированный пароль без его усечения. Вы никогда не получите пароль при входе в систему, если утерянный пароль отсутствует.