PHP SHA256 и Соль не будут работать - PullRequest
2 голосов
/ 22 июня 2011

Я пытаюсь создать пароли, которые хешируются sha256 с переменной $ 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";  
}  

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

Ответы [ 4 ]

9 голосов
/ 22 июня 2011

При попытке авторизации вы объединяете хеш с солью еще раз

$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, а пароль соответствует $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";
}
3 голосов
/ 22 июня 2011

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

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

$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";  
}  
2 голосов
/ 22 июня 2011
$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";
}

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

РЕДАКТИРОВАТЬ : я вижу, вы не храните уникальные хэши.

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

$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'])."'";  

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

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

0 голосов
/ 03 марта 2014

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

...