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

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

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

在 Web 应用开发中,安全地存储用户密码是开发者不可推卸的责任。明文存储密码是严重安全隐患,而使用强哈希算法加盐(salt)处理则是行业标准实践。PHP 提供了内置函数,让安全密码哈希变得简单可靠。

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

md5()sha1() 等快速哈希算法已被证明不适用于密码存储——它们计算过快,易受彩虹表和暴力破解攻击。现代密码哈希必须具备:慢速性、唯一性(加盐)和抗碰撞性

PHP 推荐方案:password_hash() 与 password_verify()

自 PHP 5.5 起,PHP 内置了基于 bcrypt 的密码哈希 API(也支持 Argon2,PHP 7.2+),自动处理加盐、迭代轮数等细节,无需手动管理 salt:

// ✅ 安全的密码哈希(推荐)
$password = "MySecureP@ssw0rd!";
$hash = password_hash($password, PASSWORD_ARGON2ID, [
    'memory_cost' => 65536, // 64MB 内存
    'time_cost'   => 4,
    'threads'     => 3
]);
echo "哈希值: $hash\n";

// ✅ 验证密码(自动提取 salt 和参数)
if (password_verify("MySecureP@ssw0rd!", $hash)) {
    echo "✅ 密码验证通过!\n";
} else {
    echo "❌ 密码错误。\n";
}

若需兼容旧环境,可使用 PASSWORD_BCRYPT(默认 cost=10):

$hash = password_hash("secret123", PASSWORD_BCRYPT, ['cost' => 12]);

重要安全提示

⚠️ 切勿自行拼接 salt、调用 md5($salt.$pass) 或重复哈希;
⚠️ 切勿使用 crypt()(除非明确了解其限制);
⚠️ 切勿在数据库中单独存储 salt —— password_hash() 已将 salt 编码进哈希字符串中(如 $argon2id$v=19$m=65536,t=4,p=3$...)。
优势总结:自动加盐、算法演进兼容(password_needs_rehash() 可检测是否需更新)、防时序攻击、零配置即安全。

最后,在用户注册/修改密码时使用 password_hash() 存储;登录时用 password_verify() 校验。这是 PHP 社区公认的“最简最优解”。

安全无小事。用对工具,比写对代码更重要。

```