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

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

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

在 Web 开发中,安全地存储用户密码是开发者不可推卸的责任。明文存储密码是严重安全隐患,而简单哈希(如 md5()sha1())已不再安全。PHP 提供了现代、内置的密码哈希 API,专为密码存储设计。

为什么不能用普通哈希函数?

md5('password')sha256('password') 是确定性且高速的——攻击者可轻松通过彩虹表或暴力破解还原原始密码。更危险的是,相同密码会产生相同哈希值,暴露用户行为模式。

⚠️ 切勿使用md5()sha1()crypt()(无盐)等过时方式存储密码。

推荐方案:PHP 密码哈希 API

自 PHP 5.5 起,password_hash()password_verify() 成为密码处理的黄金标准。它们默认使用 bcrypt 算法(PHP 7.2+ 支持 argon2i / argon2id),具备以下优势:

  • 自动加盐(salt),杜绝彩虹表攻击
  • 可调节计算成本(cost factor),抵御算力提升
  • 哈希字符串自带算法、cost 和 salt 信息,便于未来升级

代码示例:安全注册与登录

// ✅ 注册:生成安全哈希
$password = "MyS3cur3P@ss!";
$hash = password_hash($password, PASSWORD_ARGON2ID, [
    'memory_cost' => 65536, // 64MB 内存
    'time_cost'   => 4,      // 迭代次数
    'threads'     => 3       // 并行线程数
]);
// 输出类似:$argon2id$v=19$m=65536,t=4,p=3$...$...

// ✅ 登录:验证密码(无需关心 salt 或算法细节)
if (password_verify($inputPassword, $storedHash)) {
    echo "登录成功!";
} else {
    echo "密码错误。";
}

// 🔁 升级哈希(当系统策略更新时)
if (password_needs_rehash($storedHash, PASSWORD_ARGON2ID, ['time_cost' => 6])) {
    $newHash = password_hash($password, PASSWORD_ARGON2ID, ['time_cost' => 6]);
    // 将 $newHash 保存至数据库
}
最佳实践提示
• 始终使用 password_hash() 生成哈希,password_verify() 验证;
• 不要自行拼接 salt 或实现哈希逻辑;
• 数据库存储字段建议使用 VARCHAR(255)(Argon2 哈希最长约 250 字符);
• 定期调用 password_needs_rehash() 平滑升级算法强度。

安全不是功能,而是基础。PHP 的密码哈希 API 以极简接口封装了密码学最佳实践。作为开发者,我们只需遵循约定——让框架替我们抵御时间与算力的侵蚀。

```