如何使用PHP的password_hash函数进行密码哈希加密及验证过程详解?
- 内容介绍
- 文章标签
- 相关推荐
本文共计919个文字,预计阅读时间需要4分钟。
因为`password_hash()`默认使用bcrypt算法,并自动为每次调用生成唯一的盐值(salt),这是设计使然,不是bug。验证时,完全不需要也不应该去提取盐或比较原始的哈希字符串——内部会自动解析盐和参数。
- 错误做法:把
password_hash()结果存进数据库后,又试图用md5($pwd.$salt)手动重算比对 - 正确做法:原样保存整个哈希字符串(如
$2y$10$9z8a...),验证时只传密码和这个完整字符串给password_verify() - bcrypt 哈希长度固定为 60 字符,开头
$2y$表示算法版本,10$是 cost factor(迭代轮数),后面是 salt + hash 的 base64 编码
怎么选 cost factor?设太高会卡住用户登录
cost factor 控制 bcrypt 的计算强度,值每+1,耗时约翻倍。PHP 默认是 10,对应约 100ms 单次哈希,在现代服务器上安全且可用;设到 14 可能超过 1.5 秒,登录接口容易超时或被压垮。
本文共计919个文字,预计阅读时间需要4分钟。
因为`password_hash()`默认使用bcrypt算法,并自动为每次调用生成唯一的盐值(salt),这是设计使然,不是bug。验证时,完全不需要也不应该去提取盐或比较原始的哈希字符串——内部会自动解析盐和参数。
- 错误做法:把
password_hash()结果存进数据库后,又试图用md5($pwd.$salt)手动重算比对 - 正确做法:原样保存整个哈希字符串(如
$2y$10$9z8a...),验证时只传密码和这个完整字符串给password_verify() - bcrypt 哈希长度固定为 60 字符,开头
$2y$表示算法版本,10$是 cost factor(迭代轮数),后面是 salt + hash 的 base64 编码
怎么选 cost factor?设太高会卡住用户登录
cost factor 控制 bcrypt 的计算强度,值每+1,耗时约翻倍。PHP 默认是 10,对应约 100ms 单次哈希,在现代服务器上安全且可用;设到 14 可能超过 1.5 秒,登录接口容易超时或被压垮。

