You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:48:14