php - PHP 中的散列以使用安全密码登录

标签 php mysql security

我创建了两个文件 - 使用 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 字符串缺少强制空格,例如saltFROM 之间以及 MemberWHERE 之间。

因此,您显示的代码不可能是真正的代码,因为一旦准备语句就会失败,而这似乎不是您的问题。

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/

相关文章:

javascript - 通过 API 获取 Instagram 当前的点赞和关注限制

php - Zend_form_element_radio 无法将类添加到标签

javascript - c9 - 如何从脚本标签运行 php 函数?

mysql - 试图插入 SQL 子句的语法错误

php - 使第二个选择框的选项根据第一个选择框进行填充。两者都是 PHP 数组

PHP 数学四舍五入值

php - 如何防止使用每个 IP 地址的 PDO 连接进行反向 DNS 查找?

security - 客户端登录 - 如何在客户端安全地存储凭据?

c# - 为什么.NET RSACryptoServiceProvider 会抛出 "Safe handle has been closed"异常?

java - 从 XML 或 JSON 反序列化不受信任的数据