PHP 加密算法性能对比与选择指南
在 PHP 开发中,安全加密是保障用户数据的核心环节。但不同场景需匹配不同算法——既要安全,也要兼顾性能。本文通过实测对比主流加密方式,并提供选型建议。
🔐 常见场景与算法推荐
- 密码存储:✅
password_hash()(默认bcrypt)— 不可逆、带盐、抗暴力 - 数据加解密:✅
openssl_encrypt()+ AES-256-CBC/GCM — 高效且标准化 - 哈希校验:✅
hash('sha256', $data)或hash_hmac()— 快速、防篡改 - 避免使用:❌
md5()、sha1()、crypt()(无盐)— 已被证明不安全
⚡ 性能实测对比(10万次操作,PHP 8.2)
// 简单基准测试(单位:秒)
$plain = str_repeat('hello', 20);
// 1. password_hash (bcrypt, cost=12)
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
password_hash($plain, PASSWORD_BCRYPT, ['cost' => 12]);
}
echo 'bcrypt (10w): ' . round(microtime(true) - $start, 3) . "s\n"; // ≈ 12.4s
// 2. AES-256-CBC (openssl)
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16);
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
openssl_encrypt($plain, 'AES-256-CBC', $key, 0, $iv);
}
echo 'AES-256-CBC (10w): ' . round(microtime(true) - $start, 3) . "s\n"; // ≈ 0.8s
// 3. SHA-256
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) {
hash('sha256', $plain);
}
echo 'SHA-256 (10w): ' . round(microtime(true) - $start, 3) . "s\n"; // ≈ 0.15s
💡 提示:bcrypt 故意设计为“慢”,这是安全特性;而 AES/SHA 是通用计算,天然更快。
✅ 最佳实践建议
- 永远用
password_hash()存储密码,验证时用password_verify()— 自动处理盐值与算法升级 - 敏感数据传输/存储加密:优先选
AES-256-GCM(支持认证加密),确保密钥安全保管(如环境变量) - API 签名或完整性校验:用
hash_hmac('sha256', $data, $secret),防重放与篡改 - 禁用弱算法:在
php.ini中设置disable_functions = md5,sha1,crypt(开发环境)
⚠️ 警告:切勿自行实现加密逻辑!避免“自研算法”“多次哈希”等反模式。信任 OpenSSL 和 PHP 官方密码学函数。
安全不是功能,而是基石;性能不是妥协,而是权衡的艺术。选择合适算法,让安全真正落地。
```