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

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

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]);
    // 更新数据库中的哈希值
}
?>
最佳实践提示:
• 使用 PASSWORD_DEFAULT(未来自动适配更强算法);
• 生产环境建议显式指定 ['cost' => 12](平衡安全与性能);
• 永远不要截断哈希字符串(bcrypt 输出长度固定为 60 字符,数据库字段请设为 VARCHAR(255))。

总结:PHP 的 password_hash() 不仅大幅降低安全实现门槛,更通过标准化设计规避了开发者常见误区。安全不是功能附加项,而是从第一行密码处理代码就必须坚守的底线。

```