使用uniqid mt_rand进行哈希256

时间:2011-06-21 23:15:06

标签: php hash sha256

我有这个登录系统,我刚刚(最后)添加了哈希256。今天早些时候我和@KingCrunch以及其他一些人一起a very long thread给了我很多帮助。再次感谢。

但我现在不想做的是,我希望通过使用以下来获得$ 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']的选择,因为我希望盐是唯一的。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

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