首页 >后端开发 >php教程 >为什么即使使用加盐密码,我的会员网站也会绕过密码检查?

为什么即使使用加盐密码,我的会员网站也会绕过密码检查?

Patricia Arquette
Patricia Arquette原创
2024-11-18 21:47:02740浏览

Why Does My Member Site Bypass Password Checks Even When Salted Passwords Are Used?

如何在数据库身份验证中区分加盐密码和纯密码

在数据库身份验证中,保护密码至关重要。一种流行的技术涉及使用加盐密码,其中在散列之前将随机字符串(盐)附加到密码中。这使得破解密码的难度呈指数级增加,从而增强了安全性。

挑战:验证会员登录

在使用存储在 MySQL 中的加盐密码实现会员站点时,一个常见的问题是:登录认证过程中出现错误。登录尝试似乎错误地绕过了密码检查,从而允许未经授权的访问该网站。

检查问题代码

以下代码片段用于验证会员登录:

$name = mysqli_real_escape_string($connect, $_POST['name']);
$password = mysqli_real_escape_string($connect, $_POST['password']);
$saltQuery = "SELECT salt FROM users WHERE name = '$name';";
$result = mysqli_query($connect, $saltQuery);
if ($result === false){
    die(mysqli_error());
}
$row = mysqli_fetch_assoc($result);
$salt = $row['salt'];
$saltedPW = $password . $salt;
$hashedPW = hash('sha256', $saltedPW);
$sqlQuery = "SELECT * FROM users WHERE name = '$name' AND password = '$hashedPW'";

if (mysqli_query($connect, $sqlQuery)){
    echo '<h1>Welcome to the member site '.$name.'</h1>';
} else {
    echo 'error adding the query: '.$sql_q.'<br> Reason: '.mysqli_error($connect);
}

解决方案:正确的密码验证

问题是由于在 SQL 查询中使用直接密码比较而引起的。由于存储的密码经过加盐处理,因此此方法会将所有登录尝试误解为有效。为了纠正这个问题,我们需要执行以下步骤:

  1. 从数据库中检索加盐哈希:执行查询以获取对应的密码哈希(包括盐)到提供的用户名。
  2. 将输入的密码与加盐哈希进行比较:使用password_verify() 函数会自动从哈希值中提取盐和成本因子,以根据存储的哈希值评估输入密码的真实性。

使用 mysqli 的示例代码:

// Connect to the database
$mysqli = new mysqli($servername, $username, $password, $dbname);

// Initialize variables
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$password = mysqli_real_escape_string($mysqli, $_POST['password']);

// Fetch the salted hash for the specified username
$query = "SELECT password FROM users WHERE username = ?";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($hashedPassword);
$stmt->fetch();

// Verify the entered password
if (password_verify($password, $hashedPassword)) {
    // Login successful
    echo '<h1>Welcome to the member site '.$username.'</h1>';
} else {
    // Password did not match
    echo 'Invalid login credentials';
}

以上是为什么即使使用加盐密码,我的会员网站也会绕过密码检查?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn