PHP 哈希算法在密码存储中的应用
在 Web 应用开发中,安全地存储用户密码是开发者不可推卸的责任。明文存储密码是严重安全隐患,而简单哈希(如 md5() 或 sha1())也早已被证明不安全。PHP 提供了现代、内置的密码哈希 API,专为密码场景设计。
为什么不能用普通哈希函数?
md5('password') 或 sha256('password') 缺乏盐值(salt)和可调慢速(pepper),易受彩虹表攻击与暴力破解。现代密码哈希必须满足:加盐(salted)、自适应(adaptive)、慢速(slow) —— 这正是 PHP 的 password_hash() 和 password_verify() 所保障的。
推荐方案:PHP 原生密码哈希 API
自 PHP 5.5 起,password_hash() 默认使用 bcrypt 算法(兼容性好,抗 GPU/ASIC 攻击),并自动随机生成盐值;PHP 7.2+ 还支持 argon2i 和 argon2id(需编译支持)。以下为最佳实践示例:
// ✅ 安全注册:哈希密码并存入数据库
$password = $_POST['password'];
$hashedPassword = password_hash($password, PASSWORD_ARGON2ID, [
'memory_cost' => 65536, // 64MB 内存
'time_cost' => 4, // 迭代次数
'threads' => 3 // 并行线程数
]);
// 存储 $hashedPassword 到数据库(长度约 96 字符)
// 示例输出:$argon2id$v=19$m=65536,t=4,p=3$...$...
// ✅ 登录验证:无需解密,仅比对
if (password_verify($_POST['input_password'], $storedHash)) {
echo "登录成功!";
} else {
echo "密码错误。";
}
// 🔍 可选:检查哈希是否需要重新哈希(如算法升级或参数增强)
if (password_needs_rehash($storedHash, PASSWORD_ARGON2ID, $options)) {
$newHash = password_hash($password, PASSWORD_ARGON2ID, $options);
// 更新数据库中的哈希值
}
⚠️ 重要提醒:永远不要手动实现盐值、不要拼接字符串哈希(如
md5($salt.$pass)),也不要使用已废弃函数(crypt() 无配置时极不安全)。
兼容性与迁移建议
若项目仍运行于旧版 PHP,可使用 ircmaxell/password-compat 兼容库。但强烈建议升级至 PHP 7.4+ 或更高版本以获得 Argon2 支持与长期安全维护。
总结:安全密码存储 ≠ “加密”,而是不可逆、带盐、可调慢速的哈希过程。善用 PHP 原生密码函数,是守护用户账户的第一道坚实防线。
```