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,不可弱一分。
```