PHP 哈希算法在密码存储中的应用
在 Web 开发中,安全地存储用户密码是开发者不可推卸的责任。明文存储密码是严重安全隐患,而使用合适的哈希算法则是行业标准实践。PHP 提供了原生、安全且易用的密码哈希函数,让开发者无需手动实现复杂逻辑。
为什么不能用普通哈希(如 MD5、SHA1)?
MD5 和 SHA1 等快速哈希算法已被证明不适用于密码存储:它们计算过快,易受彩虹表攻击和暴力破解。更重要的是,它们缺乏盐值(salt)自动管理和自适应计算强度机制。
⚠️ 警告:PHP 官方已弃用
md5()、sha1() 及 crypt()(无参数)等函数用于密码哈希,切勿在新项目中使用。
推荐方案:PHP 的 password_* 函数族
自 PHP 5.5 起,PHP 内置了 password_hash() 和 password_verify() 函数,底层默认使用 bcrypt 算法(PHP 7.2+ 支持 Argon2i/Argon2id),具备以下特性:
- ✅ 自动生成并嵌入唯一盐值(salt)
- ✅ 支持可调成本因子(cost),抵御算力提升
- ✅ 哈希结果包含算法、成本、盐值与密文,格式统一(如:
$2y$10$...) - ✅ 验证时自动提取参数,无需额外存储盐值
代码示例:安全密码哈希与验证
<?php
// 用户注册:哈希密码(自动选择 bcrypt,成本因子默认为 10)
$password = "MyS3cur3P@ss!";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "哈希结果:$hash\n";
// 输出示例:$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi
// 用户登录:验证密码(自动解析哈希中的参数)
$inputPassword = "MyS3cur3P@ss!";
if (password_verify($inputPassword, $hash)) {
echo "✅ 密码正确!\n";
} else {
echo "❌ 密码错误。\n";
}
// 检查哈希是否需重新哈希(例如:算法升级或成本提高后)
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {
$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);
// 更新数据库中的哈希值
}
?>
✅ 最佳实践提示:
• 使用
• 生产环境建议显式指定
• 永远不要截断哈希字符串(bcrypt 输出长度固定为 60 字符,数据库字段请设为
• 使用
PASSWORD_DEFAULT(未来自动适配更强算法);• 生产环境建议显式指定
['cost' => 12](平衡安全与性能);• 永远不要截断哈希字符串(bcrypt 输出长度固定为 60 字符,数据库字段请设为
VARCHAR(255))。
总结:PHP 的 password_hash() 不仅大幅降低安全实现门槛,更通过标准化设计规避了开发者常见误区。安全不是功能附加项,而是从第一行密码处理代码就必须坚守的底线。