Не могу войти с зашифрованным паролем из базы

Я могу зашифровать свой пароль с помощью md5, просто обернув его вокруг -

$Password = md5($_POST['password']);

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

<?php

if(isset($_POST['btnlogin'])) {

$Email = $_POST['email'];
$Password = $_POST['password'];



$Email = mysqli_real_escape_string($connection, $Email);
$Password = mysqli_real_escape_string($connection, $Password);

$query ="SELECT * FROM customers WHERE Email = '{$Email}' AND Password =   '{$Password}'";


$select_customer_query = mysqli_query($connection, $query);

if (!$select_customer_query)

die("QUERY FAILED". mysqli_error($connection));

}

while($row = mysqli_fetch_array($select_customer_query)) {

$Email_db = $row['Email'];
$Password_db = $row['Password'];
$Firstname_db = $row['First_Name'];
$Lastname_db = $row['Last_Name'];
$string ="logged in as";
$logoutlink = '/ <a href="includes/back/logout.php">Logout</a>';



} 


if ($Email_db == $Email || $Password_db == $Password  ) {


header("Location: ../../index.php");



$_SESSION['FirstName'] = $Firstname_db;
$_SESSION['LastName'] = $Lastname_db;
$_SESSION['string'] = $string;
$_SESSION['logoutlink'] = $logoutlink;


} 


?>

person steve    schedule 07.03.2016    source источник
comment
вы не вводите пароль MD5 снова, прежде чем передать его в SQL-запрос для сравнения...   -  person Garry Welding    schedule 07.03.2016
comment
и как я могу это сделать?   -  person steve    schedule 07.03.2016
comment
Изменить $Password = mysqli_real_escape_string($connection, $Password); в $Password = md5($Password);   -  person Garry Welding    schedule 07.03.2016
comment
Если ваш пароль в БД зашифрован, и вы сравниваете его с незашифрованным, они, как правило, не совпадают   -  person Timo    schedule 07.03.2016
comment
Привет, Гарри Сварка, как насчет $connection... мне нужна эта переменная. Итак, вы говорите это - $Email = mysqli_real_escape_string($connection, $Email); $Пароль = md5($Пароль);   -  person steve    schedule 07.03.2016
comment
Не видя, что именно вставляется в базу данных при регистрации пользователя, трудно сделать что-либо, кроме как угадать. Если вы зашифруете его с помощью md5() (чего вам действительно не следует делать), все, что вам нужно сделать, это то, как предлагают ответы ниже.   -  person Qirel    schedule 07.03.2016
comment
@steve MD5 - это не шифрование, это односторонняя хеш-функция. Это также небезопасно, как минимум используйте SHA256 в качестве хеш-функции. Но вам действительно нужно использовать PBKDF2 или bcrypt со случайной солью для защиты паролей.   -  person zaph    schedule 07.03.2016


Ответы (3)


Вы забыли md5() пароль перед сравнением, вам нужно сравнить md5() версию:

$Password = md5($_POST['password']);

В настоящее время вы сравниваете $Password_db == $Password

$Password = $_POST['password']; //Not md5() hashed
$Password_db = $row['Password']; //md5() hashed

Просто совет: не используйте md5(), так как это небезопасно.

person Panda    schedule 07.03.2016
comment
@steve Если это не сработает (чего быть не должно), попробуйте повторить значения $Password и $Password_db, чтобы дважды проверить значения. - person Panda; 07.03.2016
comment
Спасибо Лувейги. Какой метод шифрования вы рекомендуете? - person steve; 07.03.2016
comment
@steve, я бы порекомендовал password_verify(), как подробно описано в ответе Скотта - person Panda; 08.03.2016
comment
Хотя это отвечает на вопрос, это все же не очень хороший совет. Не рекомендуется использовать MD5 для хеширования паролей пользователей. - person martinstoeckli; 08.03.2016

Вместо того, что вы делаете, для безопасности вам понадобится рабочий процесс, который выглядит примерно так:

  1. Возьмите идентификатор пользователя и хэш-пароль из базы данных для данного клиента.
  2. Если password_verify($password, $storedHash), продолжайте.

Не доверяйте проверку пароля запросу SELECT. Не храните пароли в открытом виде. Не используйте MD5 для защиты паролем. Не вызывайте шифрование MD5.

Рекомендуемое чтение:

person Scott Arciszewski    schedule 07.03.2016
comment
Спасибо за все ответы. У меня работает с password_verify(). - person steve; 08.03.2016

В этой строке:

$Password = $_POST['password'];

Нужно изменить на:

$Password = md5($_POST['password']);

Потому что вам нужно сравнить зашифрованные пароли.

person NormundsP    schedule 07.03.2016
comment
Это не шифрование. - person Scott Arciszewski; 07.03.2016