PHP 加密算法性能对比与选择指南

```html PHP 加密算法性能对比与选择指南

PHP 加密算法性能对比与选择指南

在 PHP 开发中,加密不是“越强越好”,而是“合适即最优”。本文通过实测对比主流算法性能,并给出生产环境选型建议。

📌 性能基准测试(PHP 8.2,10万次哈希)

// 使用 microtime() 测量性能
function benchmark($algo, $data) {
    $start = microtime(true);
    for ($i = 0; $i < 100000; $i++) {
        hash($algo, $data . $i);
    }
    return round((microtime(true) - $start) * 1000, 2) . 'ms';
}

$data = 'user_password_123';
echo "MD5:     " . benchmark('md5', $data) . "\n";
echo "SHA-256: " . benchmark('sha256', $data) . "\n";
echo "Argon2id:" . benchmark('argon2id', $data) . "\n"; // 注意:需 PHP 7.2+

典型结果(参考):
MD5: 120msSHA-256: 210msArgon2id: 1850ms

🔐 算法选型黄金法则

密码存储:必须使用 password_hash()(底层自动选用 Argon2id 或 bcrypt)
数据校验(如 API 签名):SHA-256 或 SHA-3(高安全性 + 合理性能)
绝对禁用:MD5、SHA-1(碰撞攻击已成熟,连验证场景都不推荐

💡 正确用法示例

// ✅ 密码安全存储(PHP 7.2+ 推荐 Argon2id)
$hash = password_hash('myPass123!', PASSWORD_ARGON2ID, [
    'memory_cost' => 65536, // 64MB
    'time_cost'   => 4,
    'threads'     => 3
]);
var_dump($hash); // "$argon2id$v=19$m=65536,t=4,p=3$..."

// ✅ 验证密码(自动兼容不同算法)
if (password_verify('myPass123!', $hash)) {
    echo "登录成功";
}

// ✅ 数据完整性校验(非密码场景)
$signature = hash_hmac('sha256', $payload, $secretKey);
⚠️ 重要提醒:不要自行实现加盐逻辑或拼接字符串哈希!password_hash() 已内置安全盐值与防侧信道设计,手动实现极易引入漏洞。

🎯 总结:一句话决策树

  • 存密码?→ password_hash()(默认 Argon2id)
  • 验签名/校验和?→ hash_hmac('sha256', ...)
  • 旧系统兼容?→ 至少升级到 PASSWORD_BCRYPT,禁用 MD5/SHA1

安全是纵深防御,算法只是第一环。配合 HTTPS、速率限制、敏感信息脱敏,才能构建真正可信的系统。

```