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: 120ms|SHA-256: 210ms|Argon2id: 1850ms
🔐 算法选型黄金法则
✅ 密码存储:必须使用
✅ 数据校验(如 API 签名):SHA-256 或 SHA-3(高安全性 + 合理性能)
❌ 绝对禁用:MD5、SHA-1(碰撞攻击已成熟,连验证场景都不推荐)
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、速率限制、敏感信息脱敏,才能构建真正可信的系统。
```