php 8 中最安全的密码处理方式是直接使用 password_hash() 和 password_verify():前者自动加盐并适配最强算法(如 argon2id),需 varchar(255) 存储;后者自动解析哈希参数验证,禁止手动比对;配合 password_needs_rehash() 可平滑升级旧哈希。

直接用 password_hash() 生成哈希,再用 password_verify() 验证,是 PHP 8 中最安全、最省心的做法。它自动加盐、适配算法升级,不用自己操心盐值管理或轮数设置。
用 password_hash() 创建密码哈希
调用时推荐使用 PASSWORD_DEFAULT,它会随 PHP 版本自动选用当前最强的算法(PHP 8.5 默认已是 Argon2ID)。生成的哈希字符串自带算法标识、成本参数和盐,可直接存入数据库。
- 数据库字段类型必须设为
VARCHAR(255),因为 Argon2ID 哈希可能长达 250 字符以上 - 避免手动传
salt参数——PHP 8.0 起该选项已被忽略,强行指定无效 - 若需显式控制强度,可传
options数组,例如:['memory_cost' => 65536, 'time_cost' => 4, 'threads' => 3]
用 password_verify() 校验用户输入
登录时,从数据库取出完整哈希值,连同用户提交的明文密码一起交给 password_verify()。它会自动解析哈希里的算法、盐和参数,执行完全一致的运算。
- 绝不能用
===或strcmp()手动比对——这会暴露时序差异,给攻击者留下侧信道 - 函数返回布尔值,
true表示密码正确,false表示不匹配或哈希格式异常 - 即使哈希是旧算法(如 bcrypt),该函数也能正确识别并验证
用 password_needs_rehash() 平滑升级旧哈希
当 PHP 升级或你调高了默认成本参数,已有的哈希可能不够强。可在每次成功验证后检查是否需要重哈希:
- 调用
password_needs_rehash($hash, PASSWORD_DEFAULT, $newOptions) - 若返回
true,说明当前哈希不符合新标准,应立即用新参数重新哈希并更新数据库 - 这对老系统渐进迁移特别有用,无需强制用户改密码
避开常见陷阱
很多安全隐患其实来自“看似合理”的操作:
- 禁用
md5()、sha1()、crypt()(无 salt)等过时函数——它们已被实证可快速破解 - 不要自己拼接 salt + 密码再 hash——容易出错,且无法抵御现代 GPU 暴力攻击
- 别把哈希结果截断存储——
VARCHAR(60)不够用,尤其在启用 Argon2 后会直接报错或丢失数据 - 密码字段在数据库中应加密传输(启用 TLS)、限制访问权限,哈希只是防线之一
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











