我有这个登录系统,我刚刚(最后)添加了哈希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']
的选择,因为我希望盐是唯一的。
答案 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中完成安全验证。