【发布时间】:2016-06-19 13:54:50
【问题描述】:
所以我刚刚了解了在 PHP/MySQL 中使用 MD5 哈希和盐存储密码。我使用的方法是md5(md5($row["id"].$password)),所以salt 是我的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/创建登录系统非常陌生,所以如果我做错了什么或遗漏了重要信息,请告诉我。
【问题讨论】:
-
现在是 2016 年了,为什么要使用 md5 作为密码?
-
危险:你容易受到SQL injection attacks的影响,你需要defend自己。
-
危险:您使用的是an unsuitable hashing algorithm,需要take better care的用户密码。
-
如果这是一个实时网站或打算上线,称其为因祸得福。
-
$_POST["passsword"]三个 s 正确吗?