PHP 密码加密方案对比:MD5、SHA、bcrypt

```html PHP 密码加密方案对比:MD5、SHA、bcrypt

PHP 密码加密方案对比:MD5、SHA、bcrypt

在用户认证系统中,**安全地存储密码**是开发者的第一道防线。错误的加密方式可能让整个应用暴露于严重风险之中。本文简明对比三种常见方案:MD5、SHA 系列与现代推荐方案 password_hash()(基于 bcrypt)。

❌ MD5:已淘汰,绝不用于密码

MD5 是哈希算法,但不是加密算法,且早已被证明存在严重碰撞漏洞。它无盐值、计算极快,极易被彩虹表或暴力破解。

// ❌ 危险示例(仅作演示,切勿使用!)
$password = "123456";
$md5_hash = md5($password); // "e10adc3949ba59abbe56e057f20f883e"

❌ SHA-1 / SHA-256:仍不适用于密码

SHA 系列抗碰撞性优于 MD5,但仍是快速哈希——攻击者可每秒尝试数十亿次。若未加盐或盐值固定,依然脆弱。

// ❌ 不推荐:无盐 SHA-256(易被预计算攻击)
$sha256 = hash('sha256', $password); 

// ⚠️ 稍好但不足够:手动加盐(易出错、难维护)
$salt = 'my_static_salt_2024';
$sha256_salt = hash('sha256', $salt . $password);

✅ bcrypt:PHP 官方推荐的密码哈希方案

bcrypt 是专为密码设计的慢哈希算法,内置随机盐值、可调计算强度(cost factor),能有效抵御暴力与彩虹表攻击。PHP 自 5.5+ 提供原生函数,简洁安全:

// ✅ 正确做法:使用 password_hash()(默认 bcrypt)
$password = "SecureP@ssw0rd!";
$hash = password_hash($password, PASSWORD_DEFAULT);
// 输出类似:"$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi"

// ✅ 验证密码(自动处理盐值与算法)
if (password_verify($password, $hash)) {
    echo "密码正确!";
}

// ✅ 检查哈希是否需更新(如 PHP 升级后算法演进)
if (!password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    // 当前哈希仍安全
}
✅ 最佳实践总结:
• 始终使用 password_hash() + password_verify()
• 不要自行实现盐值、迭代次数或算法选择
• 存储哈希字符串(最长 255 字符),无需额外字段存盐
• 定期用 password_needs_rehash() 平滑升级哈希强度
⚠️ 重要提醒:
MD5 和 SHA 类函数(md5(), sha1(), hash()仅适用于校验文件完整性等非敏感场景绝不可用于密码存储

安全不是功能,而是责任。从今天起,请用一行 password_hash() 替代所有“简单哈希”——这是 PHP 社区十年验证的最佳实践。

```