我创建了两个文件 - 使用 PHP 中的哈希和 MySQL 进行安全注册和安全登录。一切似乎都正常。但是,当我登录时,由于某种原因它似乎不起作用。我无法查明安全密码中的根本问题。我在代码中缺少什么?
注册:
$firstname = trim($_POST["firstname"]);
$lastname = trim($_POST["lastname"]);
$emailaddress = trim($_POST["emailAddress"]);
$username = trim($_POST["username"]);
$password = trim($_POST["password"]);
$confirmpwd = trim($_POST["confirmpwd"]);
if ($password != $confirmpwd)
{
header('Location: CreateNewAccount.php');
}
if (strlen($username) > 30)
{
header('Location: CreateNewAccount.php');
}
$hash = hash('sha256', $password);
function createSalt() {
$text = md5(uniqid(rand(), true));
return substr($text, 0, 3);
}
$salt = createSalt();
$pwd = hash('sha256', $salt . $hash);
$conn = new PDO('mysql:host=localhost;dbname=database', 'root', '');
$query = $conn->prepare('INSERT INTO Member (firstName, lastName, email, username, password, salt) VALUES (?, ?, ?, ?, ?, ?)');
$query->execute(array($firstname, $lastname, $emailaddress, $username, $pwd, $salt));
header('Location: Login.php');
登录:
$username = $_POST['username'];
$password = $_POST['password'];
$conn = new PDO('mysql:host=localhost;dbname=database', 'root', '');
$query = "SELECT password, salt"
. "FROM Member"
. "WHERE username = :username";
$result = $conn->prepare($query);
$result->bindParam(":username", $username);
$result->execute();
$number_of_rows = $result->rowCount();
if($number_of_rows == 0) // User not found. So, redirect to Login.php
{
header('Location: Login.php');
}
$userData = $result->fetch(PDO::FETCH_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));
if($hash != $userData['password']) // Incorrect password. So, redirect to Login.php
{
header('Location: Login.php');
} else // Redirect to Log Entry page
{
header('Location: LogEntry.php');
}
感谢您的帮助。
最佳答案
1) 正如 @Mofiqul Islam 在上面的评论中指出的那样,您的登录代码 ($query
) 中的 SQL 字符串缺少强制空格,例如salt
和 FROM
之间以及 Member
和 WHERE
之间。
因此,您显示的代码不可能是真正的代码,因为一旦准备语句就会失败,而这似乎不是您的问题。
2) 在您的登录代码中,您必须以与注册代码中相同的方式构建哈希。在您的登录代码中,替换行
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));
通过以下方式:
$hash = hash('sha256', $userData['salt'] . $password);
那么它应该可以工作。
尽管如此,正如一些评论所指出的,在密码散列方面不要尝试做自己的事情。相反,请使用 PHP 的现代函数 password_xxx
。
关于php - PHP 中的散列以使用安全密码登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46627941/