如何使用PHP的password_hash函数进行密码哈希加密及验证过程详解?

2026-05-07 15:250阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计919个文字,预计阅读时间需要4分钟。

如何使用PHP的password_hash函数进行密码哈希加密及验证过程详解?

因为`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 秒,登录接口容易超时或被压垮。

阅读全文
标签:PHP

本文共计919个文字,预计阅读时间需要4分钟。

如何使用PHP的password_hash函数进行密码哈希加密及验证过程详解?

因为`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 秒,登录接口容易超时或被压垮。

阅读全文
标签:PHP