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 保存至数据库
}
✅ 最佳实践提示:
• 始终使用
• 不要自行拼接 salt 或实现哈希逻辑;
• 数据库存储字段建议使用
• 定期调用
• 始终使用
password_hash() 生成哈希,password_verify() 验证;• 不要自行拼接 salt 或实现哈希逻辑;
• 数据库存储字段建议使用
VARCHAR(255)(Argon2 哈希最长约 250 字符);• 定期调用
password_needs_rehash() 平滑升级算法强度。
安全不是功能,而是基础。PHP 的密码哈希 API 以极简接口封装了密码学最佳实践。作为开发者,我们只需遵循约定——让框架替我们抵御时间与算力的侵蚀。
```