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、调用
⚠️ 切勿使用
⚠️ 切勿在数据库中单独存储 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 社区公认的“最简最优解”。
安全无小事。用对工具,比写对代码更重要。
```