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
相关产品推荐
相关产品推荐

