在PHP中哈希以使用安全密码登录

时间:2017-10-08 05:49:58

标签: 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');
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

显然,这是最奇怪的方法之一。我可能发现了一个问题。我有一个域类来存储可能导致问题的数据。跳过使用类并使用该文件完成所有工作后,到目前为止一切似乎都在工作。

但我不能排除它,因为这只是我的假设。