【问题标题】:Hash 256 with uniqid mt_rand具有 uniqid mt_rand 的哈希 256
【发布时间】:2011-06-22 09:49:53
【问题描述】:

我有这个登录系统,我刚刚(终于)添加了哈希 256。今天早些时候,我有a very long thread 和@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']。我认为这永远不会成功,因为我还没有告诉它必须选择行中的哪一列盐。

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

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

【问题讨论】:

  • 这个问题是关于mysql而不是hash和sha256,标签应该改

标签: php hash sha256


【解决方案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
}

【讨论】:

  • 再次感谢 :o) 它正在工作。我可以以某种方式检查一切是否正常工作吗?因为,当我刚刚删除和 password='$password' 时,它会正常登录。
  • @Oli 当然.. 但在不添加 if (hash('sha256', $row['salt'] . $_POST['password']) === $ 之前它也能正常工作row['password']) 但无论如何.. 它有效。我很高兴.. :o) 谢谢大家。
【解决方案2】:

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

【讨论】:

  • 编辑:别无他法。似乎它可以工作,只需删除 and password='$password'
  • @Kolind:返回结果行后,您需要在 PHP 中进行盐/密码比较。
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2023-03-18
  • 2013-01-09
  • 2012-04-28
  • 2020-04-16
  • 2021-11-25
相关资源
最近更新 更多