PHP 哈希算法在密码存储中的应用

```html PHP 哈希算法在密码存储中的应用

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+ 还支持 argon2iargon2id(需编译支持)。以下为最佳实践示例:

// ✅ 安全注册:哈希密码并存入数据库
$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 原生密码函数,是守护用户账户的第一道坚实防线。

```