PHP 加密算法性能对比与选择指南
在 PHP 开发中,安全加密是保护用户数据的核心环节。但不同算法在安全性、性能和适用场景上差异显著——盲目选择可能带来安全隐患或性能瓶颈。
常见算法性能实测(PHP 8.2)
以下为 1MB 数据的平均加密耗时(单位:毫秒,取 100 次均值):
openssl_encrypt('AES-128-GCM'): ≈ 0.8 ms —— 推荐首选openssl_encrypt('AES-256-CBC'): ≈ 1.2 ms —— 兼容性好,需手动处理 IV 和 HMACpassword_hash($pwd, PASSWORD_ARGON2ID): ≈ 120 ms —— 专用于密码哈希,不可逆hash_hmac('sha256', $data, $key): ≈ 0.05 ms —— 仅完整性校验,不加密
正确用法示例
// ✅ 安全的 AES-GCM 加密(带认证)
function encryptAesGcm(string $plaintext, string $key): array {
$iv = random_bytes(12); // GCM 推荐 12 字节 IV
$tag = '';
$ciphertext = openssl_encrypt(
$plaintext,
'aes-128-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag,
'', // aad (可选)
16 // tag length
);
return ['ciphertext' => $ciphertext, 'iv' => $iv, 'tag' => $tag];
}
// ✅ 安全解密(必须验证 tag!)
function decryptAesGcm(array $data, string $key): ?string {
$plaintext = openssl_decrypt(
$data['ciphertext'],
'aes-128-gcm',
$key,
OPENSSL_RAW_DATA,
$data['iv'],
$data['tag']
);
return $plaintext === false ? null : $plaintext;
}
⚠️ 重要警告:永远不要使用
md5()、sha1() 或 crypt() 处理密码;避免 mcrypt_*(已废弃);CBC 模式必须配合 HMAC 防篡改。
💡 选择建议:
• 密码存储 →
• 敏感数据加密 →
• 遗留系统兼容 →
• 数据签名/校验 →
• 密码存储 →
password_hash()(自动适配 Argon2ID 或 bcrypt)• 敏感数据加密 →
AES-128-GCM(兼顾速度与认证加密)• 遗留系统兼容 →
AES-256-CBC + HMAC-SHA256• 数据签名/校验 →
hash_hmac('sha256', $data, $key)
最后提醒:加密 ≠ 安全。密钥管理、随机数质量、传输层(HTTPS)同样关键。定期更新 PHP 版本以获取最新 OpenSSL 补丁,并使用 openssl_get_cipher_methods() 验证可用算法。
测试环境:PHP 8.2.12 / OpenSSL 3.0.10 / Intel i7-11800H
```