0

我有这个登录系统,我刚刚(终于)添加了哈希 256。今天早些时候,我与@KingCrunch 和其他一些人有一个很长的话题,他们帮了我很多。再次非常感谢。

但我现在不想做的是,我想通过使用使 $salt 独一无二:

$salt = uniqid(mt_rand());  $salt = uniqid(mt_rand());  
                            $password = hash('sha256', $salt.$_POST['password']);

在创建新成员时,将其设置并添加到名为“salt”的行下的数据库中。

现在,当我尝试使用创建的凭据登录时,它不会让我登录。

$salt = $row['salt'];
$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);
$row=mysql_fetch_array($result);

这是我的 login_ac.php,我必须在其中$salt成为row['salt']. 我认为这永远不会成功,因为我还没有告诉它必须选择行中的哪一列盐。

所以我的问题是:我如何让它发挥作用?是否必须创建另一个查询或类似的东西?

我需要$salt从中挑选,row['salt']因为我希望盐是独一无二的。

4

2 回答 2

1

与我在另一个问题中的回答不同,我将在此处检索用户的整行并比较 php 中的哈希值(记住:我建议在另一个问题的 sql 查询中比较它)。

$username = mysql_real_escape_string($_POST['username']);
$sql= "SELECT * FROM members WHERE username='$username'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);

这将检索用户的行。如果用户名在您的数据库中不存在,mysql_num_rows($result)将返回0(像往常一样)。但是,您可以重新创建散列并将其与保存在数据库中的散列进行比较

if (hash('sha256', $row['salt'] . $_POST['password']) === $row['password']) {
  // fine
}
于 2011-06-21T23:22:26.820 回答
0

正如在上一个问题中所指出的,如果用户名是唯一的,则不需要查询数据库的密码。只需查询用户名。然后返回的行将包含盐和密码,允许您在 PHP 中完成安全验证。

于 2011-06-21T23:20:06.633 回答