所以我刚刚学会了在 PHP/MySQL 中使用 MD5 哈希和盐存储密码。 我正在使用的方法是 md5(md5($row["id"].$password))
,所以盐是我的 SQL 表中用户 ID 的 MD5 哈希(这是一个自动递增的 INT),它连接到输入的密码字符串,然后重新哈希。
我遇到的问题是,当我尝试创建测试帐户,然后使用测试帐户登录时,登录时生成的哈希与创建帐户时创建的哈希不匹配。
登录代码:
<?php
$login = mysqli_connect("hiding this info for obvious reasons");
if ($_POST["login"])
{
$email = $_POST["email"];
$password = $_POST["passsword"];
$query = "SELECT * FROM useraccs WHERE email='$email'";
if ($result = mysqli_fetch_array(mysqli_query($login,$query)))
{
$hashpass = md5(md5($result["id"]).$password);
if ($hashpass == $result["password"])
{
$errors = "Logged in succesfully.";
}
}
else
{
$error.= "E-mail/Password do not match anything in our database.";
}
}
?>
注册码:
<?php
$login = mysqli_connect("hiding this info for obvious reasons");
if ($_POST["submit"])
{
$username = $_POST["username"];
$email = $_POST["email"];
$query = "INSERT INTO useraccs (username,email) values('$username','$email')";
mysqli_query($login,$query);
$query = "SELECT id FROM useraccs WHERE username='$username'";
$userid = mysqli_fetch_array(mysqli_query($login,$query))["id"];
$password = md5(md5($userid).$_POST["password"]);
$query = "UPDATE useraccs SET password='$password' WHERE username='$username'";
mysqli_query($login,$query);
}
?>
如您所见,我在两种情况下对密码进行哈希处理的方式是相同的,并且我已经进行了测试以确认我在两种情况下获得相同的 ID 值。 我真的很困惑为什么我没有得到匹配。
我想提一下,我对使用MySQL/创建登录系统非常陌生,所以如果我做了任何公然的错误或遗漏了基本信息,请告诉我。
首先,请参阅注释中的警告,您的代码非常不确定。
关于 md5:您正在使用
mysqli_fetch_array(mysqli_query($login,$query))["id"];
这将始终返回一个数组。确保仅获取该字段。