1

以前我用这个散列我的密码

$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>
4

3 回答 3

1

根据我的理解,您正在对密码进行哈希处理并将其插入数据库。因此,当您尝试使用实际密码登录并检查数据库时,它不匹配。

这是我简单的数学类比。

注册时输入的密码是 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'";
于 2013-08-14T02:21:52.470 回答
1

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

边注:

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

如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

这是为了防止 SQL 注入攻击:

如何防止 PHP 中的 SQL 注入?

于 2013-08-14T02:22:34.393 回答
1

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

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

我还建议阅读http://www.php.net/manual/en/book.password.php,因为 PHP 确实具有处理密码散列的内置功能。

于 2013-08-14T02:23:31.283 回答