PHP不可逆加密算法详解

```html PHP不可逆加密算法详解

PHP不可逆加密算法详解

在Web开发中,“不可逆加密”实为密码哈希(Password Hashing)——即单向散列,无法还原原始明文,但可验证输入是否匹配。PHP 提供了安全、现代的原生函数来实现这一目标,绝不应使用 md5() 或 sha1() 等弱哈希函数处理密码

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

自 PHP 5.5 起,PHP 内置了基于 bcrypt(默认)或 argon2i/argon2id(PHP 7.2+)的工业级密码哈希方案,自动加盐、抗暴力破解且随硬件升级可调成本。

🔐 密码哈希示例

// 安全地哈希用户密码(自动选择 bcrypt,生成强随机盐)
$plainPassword = "MyP@ssw0rd!2024";
$hash = password_hash($plainPassword, PASSWORD_DEFAULT);

echo "哈希结果: $hash\n";
// 输出类似:$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi

✅ 密码验证示例

// 验证用户登录时提交的密码
$userInput = "MyP@ssw0rd!2024";
if (password_verify($userInput, $hash)) {
    echo "✅ 密码正确!";
} else {
    echo "❌ 密码错误。";
}

⚙️ 进阶:指定算法与选项

如需显式使用 Argon2(内存硬、抗ASIC),确保 PHP ≥ 7.2 且编译支持:

if (defined('PASSWORD_ARGON2ID')) {
    $hash = password_hash("secret", PASSWORD_ARGON2ID, [
        'memory_cost' => 65536, // 64MB 内存
        'time_cost'   => 4,     // 迭代次数
        'threads'     => 3      // 并行线程数
    ]);
}

⚠️ 重要注意事项

× 错误做法:md5($pass)、sha1($pass)、base64_encode() —— 均非密码哈希,极易被彩虹表/暴力破解。
✓ 正确原则:始终使用 password_hash() 生成、password_verify() 验证;存储哈希值(长度可变,建议 VARCHAR(255));定期用 password_needs_rehash() 升级旧哈希。

🔍 检查并升级哈希(最佳实践)

$storedHash = '$2y$10$...'; // 数据库中旧哈希
if (password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
    $newHash = password_hash($plainPassword, PASSWORD_DEFAULT);
    // 更新数据库中的哈希值
    saveToDB($newHash);
}

总结:PHP 的 password_* 函数是处理用户凭证的黄金标准——它抽象了加盐、算法演进与安全性细节,让开发者专注业务逻辑。安全无小事,从一次正确的哈希开始。

```