如何使用数据库中的 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 id="Welcome-to-the-member-site-name">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中文网其他相关文章!

DependencyInjection(DI)inPHPenhancescodeflexibilityandtestabilitybydecouplingdependencycreationfromusage.ToimplementDIeffectively:1)UseDIcontainersjudiciouslytoavoidover-engineering.2)Avoidconstructoroverloadbylimitingdependenciestothreeorfour.3)Adhe

到Improveyourphpwebsite的实力,UsEthestertate:1)emplastOpCodeCachingWithOpcachetCachetOspeedUpScriptInterpretation.2)优化的atabasequesquesquesquelies berselectingOnlynlynnellynnessaryfields.3)usecachingsystemssslikeremememememcachedisemcachedtoredtoredtoredsatabaseloadch.4)

是的,itispossibletosendMassemailswithp.1)uselibrarieslikeLikePhpMailerorSwiftMailerForeffitedEmailSending.2)enasledeLaysBetemailStoavoidSpamflagssspamflags.3)sylectynamicContentToimpovereveragement.4)

DependencyInjection(DI)inPHPisadesignpatternthatachievesInversionofControl(IoC)byallowingdependenciestobeinjectedintoclasses,enhancingmodularity,testability,andflexibility.DIdecouplesclassesfromspecificimplementations,makingcodemoremanageableandadapt

使用PHP发送电子邮件的最佳方法包括:1.使用PHP的mail()函数进行基本发送;2.使用PHPMailer库发送更复杂的HTML邮件;3.使用SendGrid等事务性邮件服务提高可靠性和分析能力。通过这些方法,可以确保邮件不仅到达收件箱,还能吸引收件人。

计算PHP多维数组的元素总数可以使用递归或迭代方法。1.递归方法通过遍历数组并递归处理嵌套数组来计数。2.迭代方法使用栈来模拟递归,避免深度问题。3.array_walk_recursive函数也能实现,但需手动计数。

在PHP中,do-while循环的特点是保证循环体至少执行一次,然后再根据条件决定是否继续循环。1)它在条件检查之前执行循环体,适合需要确保操作至少执行一次的场景,如用户输入验证和菜单系统。2)然而,do-while循环的语法可能导致新手困惑,且可能增加不必要的性能开销。

在PHP中高效地哈希字符串可以使用以下方法:1.使用md5函数进行快速哈希,但不适合密码存储。2.使用sha256函数提高安全性。3.使用password_hash函数处理密码,提供最高安全性和便捷性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3汉化版
中文版,非常好用

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)