如何在数据库身份验证中区分加盐密码和纯密码
在数据库身份验证中,保护密码至关重要。一种流行的技术涉及使用加盐密码,其中在散列之前将随机字符串(盐)附加到密码中。这使得破解密码的难度呈指数级增加,从而增强了安全性。
挑战:验证会员登录
在使用存储在 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 查询中使用直接密码比较而引起的。由于存储的密码经过加盐处理,因此此方法会将所有登录尝试误解为有效。为了纠正这个问题,我们需要执行以下步骤:
使用 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中文网其他相关文章!