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

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

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

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

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

// 使用 microtime() 精确计时
function benchmarkHash($algo, $data) {
    $start = microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        hash($algo, $data . $i);
    }
    return round((microtime(true) - $start) * 1000, 2) . 'ms';
}

$data = 'user_password_123';
echo "SHA-256: " . benchmarkHash('sha256', $data) . "\n";   // ≈ 0.8ms
echo "BLAKE2b: " . benchmarkHash('blake2b', $data) . "\n";   // ≈ 0.6ms(更快更安全)
echo "MD5:     " . benchmarkHash('md5', $data) . "\n";       // ≈ 0.3ms(⚠️ 已不安全!)

🔐 密码哈希:首选 password_hash()

永远不要手写盐值或用 md5()/sha1() 存密码!

// ✅ 正确:自动选择 bcrypt(默认)或 argon2id(PHP 7.2+)
$hash = password_hash('mySecret123', 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('mySecret123', $hash)) {
    echo "登录成功";
}
⚠️ 警告:避免使用 crypt() 或自定义 salt —— password_hash() 已内置强随机盐和抗时序攻击逻辑。

📦 数据加密:对称 vs 非对称

  • 敏感数据加解密 → 用 openssl_encrypt() + AES-256-GCM(认证加密)
  • API 签名/令牌验证 → 用 hash_hmac('sha256', $data, $key)
  • 数字签名 → 用 openssl_sign()(RSA/ECDSA),非加密!

✅ 选型速查表

场景推荐方案备注
用户密码存储PASSWORD_ARGON2ID内存硬、抗 GPU 破解
会话 ID / Token 生成random_bytes(32)配合 bin2hex() 或 Base64
配置文件加密AES-256-GCM + OpenSSL务必验证 tag,防止篡改
第三方 API 签名HMAC-SHA256密钥保密,时间戳防重放
💡 最佳实践:定期更新 PHP 版本(新版本优化 OpenSSL 性能);禁用 mcrypt(已废弃);所有密钥使用 random_bytes() 生成,绝不用 rand()mt_rand()

加密是纵深防御的一环。性能重要,但安全性永远优先——宁可慢 10ms,不可弱一分。

```