使用硬编码哈希时password_hash与password_verify验证始终返回false求助
解决PHP password_verify硬编码哈希验证失败的问题
嘿,我猜你碰到的问题是用硬编码的$hashB调用password_verify()时返回false,对吧?这其实是个挺常见的小坑,我来给你捋清楚原因和解决办法:
问题根源
你定义$hashB的时候用了双引号",PHP在处理双引号包裹的字符串时,会自动解析里面的$符号,把它当成变量名来处理。你看你的哈希值里有一堆$,比如$2y$10$...,PHP会尝试把$2y、$10这些当作变量,但这些变量根本没定义,结果就是哈希字符串被破坏,变成了错误的内容,自然验证通不过。
解决办法
有两种简单的修复方式,推荐第一种:
- 改用单引号包裹哈希字符串:单引号里的内容会被PHP当作纯文本,不会解析任何变量,能完整保留哈希值的原始内容。
- 如果一定要用双引号,就把每个
$都转义成\$,不过这种方式写起来麻烦,不如单引号省心。
修改后的测试代码
<?php $password = "YS7Wde5s"; $hashA = password_hash($password, PASSWORD_BCRYPT); echo $hashA . "<br>"; // 用单引号包裹,避免PHP解析$符号 $hashB = '$2y$10$nltCAZhbMD2OILgq2ftWNOd6kJL8oidQ12CLEM5Gi1kIj5GxKtNhm'; // 验证hashA if (password_verify($password, $hashA)) { echo "yes (hashA验证通过) <br>"; } else { echo "no (hashA验证失败) <br>"; } // 验证hashB if (password_verify($password, $hashB)) { echo "yes (hashB验证通过)"; } else { echo "no (hashB验证失败)"; } ?>
运行这段修改后的代码,你会发现hashB也能正常验证通过了。
内容的提问来源于stack exchange,提问作者Sir Tobi
相关产品推荐
相关产品推荐

