如何使用数据库中的 Salted 密码对用户进行身份验证
在数据库驱动的 Web 应用程序中,保护用户密码免遭未经授权的访问至关重要。加盐密码是一项重要的安全措施,可以增强对用户凭据的保护。在本次问答中,我们将探讨如何从数据库检索和验证加盐密码以进行安全的用户身份验证。
问题:
开发人员实现了一个成员网站的加盐密码存储在 MySQL 数据库中。但是,由于验证会员存在问题,登录页面允许任何人进入会员网站。
检查会员存在的代码:
$servername = 'localhost'; $username = 'root'; $pwd = ''; $dbname = 'lp001'; $connect = new mysqli($servername, $username, $pwd, $dbname); if ($connect->connect_error) { die('connection failed, reason: ' . $connect->connect_error); } $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 查询从数据库中获取所提供的加盐密码哈希值用户名。
计算哈希密码:
将用户输入的密码与检索到的盐连接起来,并使用与所使用的相同的哈希函数对其进行哈希处理用于将密码存储在
将哈希密码与存储的哈希进行比较:
将计算出的哈希密码与存储的加盐密码哈希进行比较。如果匹配,则用户的密码正确。
以下是会员存在检查代码的更新版本,其中包含以下步骤:
$verifyQuery = "SELECT id, password FROM users WHERE name = '$name';"; $verifyResult = mysqli_query($connect, $verifyQuery); if ($verifyResult === false) { die(mysqli_error()); } $verifyRow = mysqli_fetch_assoc($verifyResult); if ($verifyRow) { $storedHash = $verifyRow['password']; $saltedPW = $password . $verifyRow['salt']; $hashedPW = hash('sha256', $saltedPW); if ($hashedPW === $storedHash) { // User authenticated successfully } else { // Incorrect password } } else { // User not found }
结论:
通过执行以下步骤,开发人员可以根据加盐密码哈希安全地验证用户密码存储在数据库中。这确保了用户凭据的完整性和保护,防止未经授权的访问。
以上是为什么我的加盐密码身份验证在我的 MySQL 数据库中不起作用?的详细内容。更多信息请关注PHP中文网其他相关文章!