Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我有我的密码,但当我登录时,它无法识别_Php_Sql - Fatal编程技术网

Php 我有我的密码,但当我登录时,它无法识别

Php 我有我的密码,但当我登录时,它无法识别,php,sql,Php,Sql,以前我用这个哈希我的密码 $password = hash('sha256' , $salt.$password_arr[$i]); 在config.php中,我有一段代码来修改密码 $salt = 'jhfdkjdhfTyhdh3365@jdh69kkshhQAAAiyeg'; 因此,我的sql数据库在注册新密码时会显示哈希代码,我对此很满意,但当我登录时,它似乎无法识别我的密码,因为身份验证是直接从数据库数据进行身份验证的。那我该怎么做才能让它工作呢 这是我的登录验证代码 <?ph

以前我用这个哈希我的密码

$password = hash('sha256' , $salt.$password_arr[$i]);
在config.php中,我有一段代码来修改密码

$salt = 'jhfdkjdhfTyhdh3365@jdh69kkshhQAAAiyeg';
因此,我的sql数据库在注册新密码时会显示哈希代码,我对此很满意,但当我登录时,它似乎无法识别我的密码,因为身份验证是直接从数据库数据进行身份验证的。那我该怎么做才能让它工作呢

这是我的登录验证代码

<?php 
session_start();
include('adminconfig.php');
// username and password sent from form
$username=$_POST['userID'];
$password=$_POST['password'];

// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM admin WHERE ID='$username' and
password='$password'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($result && $count==1){
$_SESSION['userID']= $_POST['userID'];
header('location:adminprofile.php');
}
else {
header('location:adminmessage.php');
die;
}
?>
 </body>
 </html>

据我了解,您正在对密码进行哈希运算并将其插入数据库。因此,当您尝试使用实际密码登录并签入数据库时,它不匹配

这是我简单的数学类比

注册时输入的密码为2。 让我们说,当你将它散列时,你会向它添加3。所以在散列之后,你的密码是5。 5插入到数据库中

现在,当您登录时,输入密码为2。 检查数据库时,2与5不匹配,因此登录失败

底线是,在表单验证您的登录后,对密码进行散列,然后签入数据库,它应该可以工作

在这些行之间添加哈希函数:

$password=mysql_real_escape_string($password);
$password = hash($password , $salt.$password_arr[$i]);
$sql="SELECT * FROM admin WHERE ID='$username' and password='$password'";

虽然您说您对密码进行了哈希和盐处理,但在查询数据库之前似乎忘记了这样做,因此您的查询不会返回任何结果

旁注:

您应该考虑以下的密码散列安全性:

这有助于防止SQL注入攻击:


为了检查密码是否正确,您需要以将密码存储在数据库中的相同方式对密码尝试进行散列。由于哈希是单向函数,因此无法从哈希中获取“真实”密码。您可以做的是以相同的方式对新值进行散列,看看它是否得到相同的输出。这背后的理论是,没有两个值可以作为哈希函数的输入提供相同的输出值

您在数据库中存储的是哈希(real_password+salt)。所以您需要查看hash(尝试的密码+salt)=数据库值。如果它们匹配,则尝试的密码必须正确,并且用户已通过身份验证


我还建议阅读,因为PHP确实具有处理密码散列的内置功能。

当您将密码与数据库中的密码进行比较时,必须再次对其进行散列。但即使是我对其进行散列,它也与数据库中的散列代码不同,不是吗?您需要以创建密码的方式对其进行散列。同样的盐。同样的算法。我在您的代码中没有看到这方面的证据。您可能还应该考虑使用PBKDF2或bcrypt散列密码。看到这个答案:在设置标题或调用session\u start之前,您也不能有任何输出。我怀疑你在这么做。虽然我已经读了一遍,但我仍然不知道如何将输入的密码与数据库哈希密码进行比较,你能给我举个例子吗?