讲师中心 微信公众号
AI工具推荐 视频效率加速

如何通过 password_verify 防御计时攻击

星宇酱_8680

星宇酱_8680

发布时间:2026-03-05 15:16:17

|

401人浏览过

|

来源于php中文网

原创

如何通过 password_verify 防御计时攻击

password_verify 本身不依赖 cost 参数实现恒定时间比较;它先复现原始哈希(使用嵌入在 hash 中的算法、salt 和 cost),再通过恒定时间字符串比较函数逐字节比对结果,从而消除因匹配长度差异导致的响应时间泄露。

`password_verify` 本身不依赖 cost 参数实现恒定时间比较;它先复现原始哈希(使用嵌入在 hash 中的算法、salt 和 cost),再通过恒定时间字符串比较函数逐字节比对结果,从而消除因匹配长度差异导致的响应时间泄露。

在 PHP 的密码安全实践中,password_verify() 是验证用户输入密码是否正确的关键函数。其安全性不仅体现在哈希强度上,更深层地依赖于抗侧信道攻击设计——尤其是对计时攻击(Timing Attack) 的主动防御。

核心机制:两阶段安全验证

password_verify($password, $hash) 的执行分为两个逻辑阶段:

  1. 哈希重计算(非恒定时间,但必要且安全)
    函数首先解析 $hash 字符串(如 $2y$10$...),提取其中编码的算法标识(如 bcrypt)、cost 因子(如 10)和 salt。随后,它用完全相同的参数对 $password 执行一次完整的密码哈希运算。这一步耗时取决于 cost(例如 bcrypt 的 2¹⁰ 次迭代),并非恒定时间,但这是必需的、且不构成计时攻击面——因为攻击者无法控制或观测哈希计算内部的中间状态,且所有输入都需完成完整计算才能进入下一步。

  2. 恒定时间字符串比较(防御计时攻击的关键)
    得到新计算的哈希值后,password_verify 不使用常规的 == 或 hash_equals() 以外的普通字符串比较,而是调用底层 C 实现的恒定时间比较函数(PHP 内部等价于 hash_equals() 的语义)。该函数确保:

    • 无论两个哈希值在第几位开始不同,都强制遍历全部字节;
    • 比较过程不包含早期退出(no short-circuiting);
    • CPU 指令执行路径与数据内容无关(避免分支预测泄露)。

以下为简化示意(不可直接运行,仅说明原理):

word报告自动生成神器
word报告自动生成神器

Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。

下载
// ❌ 危险:易受计时攻击的朴素比较(仅作对比)
function insecure_compare($a, $b) {
    if (strlen($a) !== strlen($b)) return false;
    for ($i = 0; $i < strlen($a); $i++) {
        if ($a[$i] !== $b[$i]) return false; // 一旦发现不同立即返回 → 时间泄露
    }
    return true;
}

// ✅ 安全:恒定时间比较(PHP 内置 password_verify 已实现此逻辑)
if (hash_equals($expected_hash, $computed_hash)) {
    // 验证通过
}

⚠️ 注意事项:

  • 不要自行实现哈希比较逻辑:即使使用 hash_equals(),也务必确保比较的是两个等长、已知安全的哈希值;若长度不等,应先做长度校验(但需注意:password_hash() 输出长度固定,故 password_verify() 可安全跳过此步)。
  • cost 参数的作用被常见误解:cost 仅控制哈希计算的计算强度(如 bcrypt 迭代次数),不影响比较阶段的耗时。它提升的是离线暴力破解成本,而非在线验证的防侧信道能力。
  • 始终使用 password_hash() / password_verify() 组合:二者协同工作,前者生成含元数据的自描述哈希,后者自动解析并安全验证,无需开发者手动处理 salt 或算法选择。

总结而言,password_verify 的抗计时攻击能力源于其解耦设计:将“可变耗时”的密码学计算(依赖 cost)与“严格恒定耗时”的二进制比较完全分离,并在后者中采用密码学安全的恒定时间原语。这一设计使攻击者无法通过测量验证响应时间来推断密码正确性或部分字节信息,是现代 Web 应用身份认证不可或缺的安全基石。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11644

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6701

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2175

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4248

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4974

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3891

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5617

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4402

2023.11.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn