Как зайти на страницу используя пароль после хеширования

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

Вот ниже код хеширования

// Get values from form
$fullname=$_POST['userid'];
$username=$_POST['username'];
$email=$_POST['uemail'];
$password=$_POST['passid'];
$birthdate=$_POST['birthdate'];
$country=$_POST['mytextarea'];
$hash = hash('sha256', $password);

function createSalt()
{
$text = md5(uniqid(rand(), true));
return substr($text, 0, 3);
}

$salt = createSalt();
$password = hash('sha256', $salt . $hash);
// Insert data into mysql
$sql="INSERT INTO tbl_registration(`fullname`,`username`,`email`,`password`,`birthdate`, `country`) VALUES('{$fullname}', '{$username}', '{$email}', '{$password}', '{$birthdate}', '{$country}' )";
$result=mysql_query($sql);

Вот ниже я использую код входа в систему …

// userName and password sent from form
$myusername=$_POST['username'];
$mypassword=$_POST['password'];

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row

if($count==1 ){
if(crypt($password, $row['Password']) == $row['Password'])
{
header("location:index.php");
exit();
}
}
else {
//echo "Wrong Username or Password";
header("Location:login.php?errorMssg=".urlencode("Wrong Username or Password"));
}

Так что я буду делать сейчас ..

0

Решение

Вы сравниваете хешированный / соленый пароль с текстовым паролем.

Например:
5a44e87906e4e5dbf7991d5784fd56f14dc426aafbd8dbb7b1e0953e1399f2ad не равно foo

Примечание: функции mysql устарели. Вы должны использовать PDO или другое. Ваш код может быть написан немного чище. Если вам нужно лучшее объяснение, я могу помочь вам с этим.

отредактированный хеш-код:

// Get values from form
$fullname=$_POST['userid'];
$username=$_POST['username'];
$email=$_POST['uemail'];
$password=$_POST['passid'];
$birthdate=$_POST['birthdate'];
$country=$_POST['mytextarea'];
$hash = hash('sha256', $password);

function createSalt()
{
return '2123293dsj2hu2besdbsjdsd';
}

$salt = createSalt();
$password = hash('sha256', $salt . $hash);
// Insert data into mysql
$sql="INSERT INTO tbl_registration(`fullname`,`username`,`email`,`password`,`birthdate`, `country`) VALUES('{$fullname}', '{$username}', '{$email}', '{$password}', '{$birthdate}', '{$country}' )";
$result=mysql_query($sql);

отредактированный логин-код:

// userName and password sent from form
$myusername=$_POST['username'];
$mypassword=$_POST['password'];

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$salt = createSalt();
$hash = hash('sha256', $mypassword);
$mypassword = hash('sha256', $salt . $hash);

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row

if($count==1 ){
if(crypt($password, $row['Password']) == $row['Password'])
{
header("location:index.php");
exit();
}
}
else {
//echo "Wrong Username or Password";
header("Location:login.php?errorMssg=".urlencode("Wrong Username or Password"));
}

function createSalt()
{
return '2123293dsj2hu2besdbsjdsd';
}
2

Другие решения

Вот некоторая иллюстрация, но обратите внимание, что это не предложение или же хорошая практика.

Допустим, у вас есть таблица базы данных с минимальным полем Идентификатор, имя пользователя, пароль. Поэтому, когда вы берете значение ввода из поля пароля, вы шифруете его любым выбранным вами способом.

Пример: $password = sha1($_POST['password']); в этом случае пользователь вводит значение ‘abcdef’. Поскольку это было шифрование с использованием sha1, вы получили значение, поворачивающееся от ABCDEF в 1f8ac10f23c5b5bc1167bda84b833e5c057a77d2

Затем вы сохраняете это в базу данных, поэтому внутри столбца пароля базы данных у вас есть значение 1f8ac10f23c5b5bc1167bda84b833e5c057a77d2.

Теперь, когда пользователь хочет войти, он / она входит ABCDEF <= это то, что вы получили из поля ввода. Итак, прежде чем сравнивать значение из базы данных с вводом, снова необходимо повернуть значение, предоставленное вводом, в sha1 шифрование.

$password = sha1($_POST['password'];

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

$query = "SELECT * FROM tableName WHERE (username='$username' AND password='$password')";
$result = mysqli_query($conn, $query);
if (@mysqli_num_rows($result) == 1)
{
//if one database row (record) matches the input start the session, fetch the record and insert the three values in an array
session_start();
$_SESSION = mysqli_fetch_array($result, MYSQLI_ASSOC);
header("Location: any/where/you/like");
}
else
{
// No match was made
$errors[] = 'Sorry no record match with the data you have submitted';
}

Я думаю, что это самое основное для сравнения зашифрованных значений. Еще раз это просто иллюстрация & не решение или предложение.

0

Вы должны действительно переключиться на функцию PHP password_hash (). Ни алгоритм SHA-256, ни тем более статическая соль не подходят для хеш-паролей.

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

Если вы заинтересованы в дополнительной информации, посмотрите на мой руководство о безопасном хранении паролей.

0
По вопросам рекламы ammmcru@yandex.ru