PHP推荐使用password_hash()加密密码,默认bcrypt算法自动加盐抗暴力破解;验证用password_verify()防时序攻击;可调cost参数(10–12);旧哈希通过password_needs_rehash()平滑升级。

PHP 中推荐使用 password_hash() 对用户密码进行加密,它默认采用 bcrypt 算法,自动加盐、抗暴力破解,且随 PHP 版本升级可适配更安全的算法,比手动 md5、sha1 或 base64 完全不可取。
一、基础用法:一行生成安全哈希
只需传入明文密码,函数自动处理盐值和算法细节:
$hash = password_hash('myPass123', PASSWORD_DEFAULT);
返回类似 $2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi 的字符串,长度固定(目前 60 字符),包含算法标识、成本因子、盐和密文。
二、验证密码:用 password\_verify(),别自己比对
存储哈希后,登录时用 password_verify() 校验,它会自动提取盐和参数重算:
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
立即学习“PHP免费学习笔记(深入)”;
if (password_verify('myPass123', $hash)) {
echo '登录成功';
} else {
echo '密码错误';
}
- 该函数恒定时间比较,防时序攻击
- 即使未来 PHP 升级默认算法(如从 bcrypt 切到 argon2),旧哈希仍能正常验证
- 绝不直接用
==或===比较哈希字符串
三、可选参数:控制强度与兼容性
通过数组传入选项,常用两项:
- cost:计算成本(默认 10),值越大越慢越安全(建议 10–12)
- salt:PHP 7.0+ 已废弃,禁止手动指定,否则触发 E_DEPRECATED 警告
$hash = password_hash('pwd', PASSWORD_DEFAULT, ['cost' => 12]);
四、升级旧哈希:用 password\_needs\_rehash()
当用户下次登录时,检查其哈希是否需更新(比如算法升级或 cost 提高):
if (password_needs_rehash($storedHash, PASSWORD_DEFAULT, ['cost' => 12])) {
$newHash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// 更新数据库中的哈希
}
这是平滑迁移安全策略的关键机制,无需批量重算所有密码。


















