PHP 加密安全常见漏洞与防护

```html PHP 加密安全常见漏洞与防护

PHP 加密安全常见漏洞与防护

加密是 Web 应用安全的基石,但错误使用 PHP 加密函数极易引入严重风险。以下是开发者最常踩的三大陷阱及正确实践。

❌ 漏洞一:使用过时/不安全的哈希算法

md5()sha1() 已被证实易受碰撞攻击,且无盐值保护,无法抵御彩虹表攻击。

⚠️ 危险示例:
// ❌ 绝对禁止!
$password_hash = md5($_POST['password']); // 无盐、可逆性弱、已破解

✅ 正确做法:使用 PHP 内置的 password_hash()(基于 bcrypt)并配合 password_verify()

// ✅ 安全哈希(自动加盐 + 自适应成本)
$hash = password_hash($_POST['password'], PASSWORD_ARGON2ID); // 或 PASSWORD_BCRYPT
// 验证时:
if (password_verify($input, $stored_hash)) {
    echo "登录成功";
}

❌ 漏洞二:手动实现加密逻辑(如自定义 AES)

绕过 OpenSSL 手写加密极易导致 IV 重用、填充错误、密钥管理混乱等致命问题。

⚠️ 危险示例:
// ❌ 不安全的“自制”AES(缺少认证、IV 固定、无密钥派生)
$key = 'my16bytekey12345'; // 硬编码密钥!
$iv = str_repeat("\0", 16); // 静态 IV → 完全可预测
$cipher = openssl_encrypt($data, 'AES-128-CBC', $key, 0, $iv);

✅ 正确做法:使用 openssl_encrypt() + AEAD 模式(如 AES-256-GCM),并严格管理 IV 和密钥:

// ✅ 安全加密(带认证、随机 IV、密钥派生)
$ivlen = openssl_cipher_iv_length($cipher = 'AES-256-GCM');
$iv = openssl_random_pseudo_bytes($ivlen);
$key = hash_pbkdf2('sha256', $password, $salt, 100000, 32, true); // 密钥派生
$encrypted = openssl_encrypt($data, $cipher, $key, OPENSSL_RAW_DATA, $iv, $tag);
$final = base64_encode($iv . $tag . $encrypted); // 安全序列化

❌ 漏洞三:混淆 ≠ 加密

使用 base64_encode()str_rot13() 或简单异或仅作“隐藏”,毫无安全性可言 —— 这是编码,不是加密!

// ❌ 伪安全:base64 不是加密!
$token = base64_encode("user_id=123&role=admin"); // 可瞬间解码

✅ 正确替代:敏感数据应存储于服务端会话中;若需客户端传递,使用 JWT(经签名/加密)或短期有效令牌。

💡 最佳实践总结

  • 密码哈希:永远用 password_hash() + password_verify()
  • 对称加密:优先选 AES-256-GCM,IV 必须随机且唯一,密钥需 PBKDF2/HKDF 派生
  • 密钥管理:绝不硬编码!使用环境变量或密钥管理服务(如 AWS KMS)
  • 依赖更新:定期运行 composer update 并审计加密库(如 defuse/php-encryption)

安全不是功能,而是设计原则。每一次加密调用,都该有明确的威胁模型与验证机制。

```