PHP 哈希算法在密码存储中的应用
在 Web 应用开发中,安全地存储用户密码是开发者不可推卸的责任。明文存储密码是严重安全隐患,而简单哈希(如 md5() 或 sha1())也早已被证明不安全。PHP 提供了现代、内置的密码哈希 API,专为密码存储设计。
为什么不能用普通哈希?
MD5、SHA-1 等通用哈希算法计算速度快、无盐值(salt)、易受彩虹表攻击。攻击者可批量破解海量哈希值。安全密码哈希需满足:慢速、加盐、自适应——这正是 PHP 的 password_hash() 和 password_verify() 所提供的。
推荐方案:PHP 密码哈希 API(PHP 5.5+)
该 API 默认使用 bcrypt 算法(PASSWORD_BCRYPT),支持自动加盐与可调成本因子(默认 cost=10),未来还可无缝升级至 Argon2(PHP 7.2+ 支持 PASSWORD_ARGON2I)。
代码示例
<?php
// ✅ 安全:注册时哈希密码
$password = "MyS3cur3P@ss!";
$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// 输出示例:$2y$12$ZQz...(含算法、cost、salt 和哈希值)
// ✅ 安全:登录时验证密码
$userInput = "MyS3cur3P@ss!";
if (password_verify($userInput, $hashedPassword)) {
echo "登录成功!";
} else {
echo "密码错误。";
}
// 🔍 可选:检查哈希是否需要重哈希(如 cost 升级后)
if (password_needs_rehash($hashedPassword, PASSWORD_BCRYPT, ['cost' => 12])) {
$hashedPassword = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
?>
⚠️ 重要提醒:切勿手动实现盐值、拼接字符串或使用
md5($pass.$salt) 等方式。PHP 密码 API 已完全封装安全性细节,且随 PHP 版本自动演进。
兼容性与最佳实践
- 始终使用
password_hash()生成哈希,password_verify()验证; - 哈希结果可直接存入数据库(最长 255 字符,建议
VARCHAR(255)); - 避免使用已废弃函数:
crypt()(除非明确需要)、md5()、sha1(); - 如需兼容旧系统,可用
password_hash()迁移存量密码(首次登录时重哈希)。
安全不是功能,而是基础。用对 PHP 的密码哈希 API,就是为用户账户筑起第一道可信防线。
```