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

PHP中password_verify()函数工作原理及盐值作用疑问

PHP password_verify() 验证逻辑与盐值作用解析

一、password_verify() 到底怎么验证哈希?

你的核心理解是对的,再给你细化下实际流程:

  • 用password_hash()生成的哈希字符串,是个包含所有验证参数的复合串,格式大概是$算法标识$成本系数$随机盐值$最终哈希结果(比如$2y$10$abcdefghijklmnopqrstu...)。
  • 调用password_verify($输入密码, $存储的哈希串)时,函数会先从哈希串里解析出对应的算法、成本、盐值,接着用这些参数重新对输入密码做哈希运算,最后把新生成的哈希和原哈希串里的哈希部分对比——完全一致就返回true,否则返回false。

二、盐值能被分离出来,是不是就没用了?

这是对盐值作用的典型误解,盐值的核心作用从来不是保密,而是破解彩虹表攻击:

  • 彩虹表是黑客预先算好的「常用密码+无盐哈希」对照表,要是所有用户密码都用无盐哈希,黑客拿到哈希库后,查彩虹表就能批量破解一大批密码。
  • 但每个用户的哈希都带独立随机盐值后,哪怕两个用户用一模一样的密码,哈希结果也完全不同。黑客没法再用通用彩虹表批量破解,只能针对每个用户的盐值单独暴力计算,这会把破解的时间成本提升几个数量级——哪怕盐值是公开的,这个作用依然存在。

举个直观例子:

  • 无盐哈希时,密码123456的哈希结果固定,黑客破解一个就能匹配所有用这个密码的用户。
  • 加了随机盐值后,用户A的盐是abc,哈希结果是hash(123456+abc);用户B的盐是def,哈希结果是hash(123456+def),两者完全不同,黑客必须分别暴力破解这两个哈希,难度陡增。

另外要注意:PHP的password_hash()默认会自动生成安全的随机盐值,完全不需要开发者手动指定盐值,这也是官方推荐的做法——手动指定盐值反而容易出安全问题。

内容的提问来源于stack exchange,提问作者Osama Mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:40:19