php推荐使用password_hash与password_verify函数实现安全密码哈希:一、用password_hash生成含盐哈希并存储;二、用password_verify比对密码;三、可指定bcrypt及cost参数;四、用password_needs_rehash平滑升级旧哈希;五、用password_get_info验证哈希格式。

当您需要在PHP应用中安全地存储和验证用户密码时,直接使用MD5或SHA系列哈希函数已不再符合现代安全实践。PHP内置的password_hash与password_verify函数提供了基于bcrypt(默认)、argon2i或argon2id的自适应哈希机制,能自动处理盐值生成、算法迭代与版本兼容性。以下是使用这两组函数完成密码加密存储与校验的具体操作步骤:
一、使用password_hash生成安全密码哈希
password_hash函数根据指定算法对明文密码执行不可逆哈希运算,并嵌入随机盐值与算法参数,输出可直接存储于数据库的字符串。该字符串包含算法标识、成本因子、盐及哈希结果,无需单独保存盐值。
1、声明待加密的原始密码字符串,例如 $password = "user123!";
2、调用 password_hash($password, PASSWORD_DEFAULT) 获取哈希值;PASSWORD_DEFAULT 可能在PHP版本升级后切换算法,确保长期兼容性需记录哈希字符串前缀
3、将返回的哈希字符串(如 "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi")存入数据库 password 字段。
二、使用password_verify校验用户登录密码
password_verify函数接收原始密码与数据库中存储的完整哈希字符串,自动解析其中的算法、盐和参数,并执行相同逻辑的哈希比对,返回布尔值结果,不暴露时序差异。
1、从数据库查询对应用户名的哈希值,赋值给变量 $hash,例如 $hash = "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi";
2、调用 password_verify($input_password, $hash),其中 $input_password 为用户本次提交的明文密码。
3、若返回 true,则密码正确;返回 false 并不区分是密码错误还是哈希格式异常,禁止据此向用户泄露具体失败原因
三、手动指定bcrypt算法与成本因子
当需控制哈希计算强度或规避PASSWORD_DEFAULT未来变更影响时,可显式选择PASSWORD_BCRYPT并设定cost参数,使哈希过程在不同硬件上保持可控耗时。
1、构造选项数组 $options = ['cost' => 12];,cost值范围为4–31,默认为10。
构建并排查Microsoft Word邮件合并及DOCX模板工作流,使用合并域、内容控件、文档属性、重复区块、数据等
2、调用 password_hash($password, PASSWORD_BCRYPT, $options) 生成对应强度的哈希值。
3、cost每增加1,计算耗时约翻倍;过高可能导致HTTP超时,建议在目标服务器实测后选定8–14区间值
四、升级旧哈希至新算法或更高成本
当系统升级PHP版本或调整安全策略时,已存储的旧哈希可能使用较低cost或过时算法。password_needs_rehash函数可检测是否需重新哈希,实现平滑迁移。
1、用户成功登录后,获取其数据库中存储的哈希值 $hash 和本次验证通过的明文密码 $password。
2、执行 if (password_needs_rehash($hash, PASSWORD_DEFAULT)) 判断是否需要更新。
3、若条件为真,则调用 $new_hash = password_hash($password, PASSWORD_DEFAULT),并将 $new_hash 写回数据库对应字段;仅在验证通过且检测到需重哈希时才执行更新,避免无效写入
五、验证哈希字符串格式有效性
在导入外部数据或调试场景中,需确认某字符串是否为合法的password_hash输出。password_get_info函数可解析结构并返回算法、选项等元信息,不执行实际校验。
1、传入待检测字符串至 $info = password_get_info($hash);
2、检查 $info['algoName'] 是否为 "bcrypt"、"argon2i" 或 "argon2id";若为 "unknown",说明该字符串不符合任何内置算法格式,不可用于 password_verify
3、检查 $info['options']['cost'] 是否在有效范围内,确认其是否具备预期强度参数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










