为何password_verify()返回False,相同哈希值用==比较却返回True?
问题成因分析
首先看示例代码:
<?php $A = 'ABCD'; $B = 'ABCD'; $md5A = md5($A); //cb08ca4a7bb5f9683c19133a84872ca7 $md5B = md5($B); //cb08ca4a7bb5f9683c19133a84872ca7 echo "Using the password_verify() funtion "; if (password_verify($md5A, $md5B)) { echo "True"; } else { echo "False"; } echo " Using the == comparison "; if ($md5A == $md5B) { echo "True"; } else { echo "False"; } ?>
在上述PHP代码中,变量$A与$B的取值完全相同,二者的MD5哈希值也一致,但调用password_verify()进行验证时返回False,使用==运算符比较却返回True,请问该问题的成因是什么?
核心原因
password_verify() 不是用来对比普通哈希值的工具函数,它是专门配合password_hash()生成的结构化密码哈希串设计的。
具体细节:
password_verify()的第二个参数要求必须是password_hash()生成的完整哈希串,这类串包含算法标识、盐值、哈希结果等信息,格式类似$2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。- 你传入的
$md5B是普通的MD5哈希字符串,完全不符合password_verify()要求的结构化格式,函数会直接判定验证失败,返回False。
而==运算符只是做单纯的字符串内容对比,这里两个MD5哈希值内容完全一致,所以返回True。
补充说明
如果只是要验证普通哈希值的一致性,直接用字符串比较(推荐用===做严格类型+内容对比)即可;只有处理用户密码的存储与验证场景时,才应该用password_hash()生成哈希,再用password_verify()验证,这也是PHP官方推荐的安全密码处理方案。
内容的提问来源于stack exchange,提问作者Tirath Singh
相关产品推荐
相关产品推荐

