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

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

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,就是为用户账户筑起第一道可信防线。

```