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

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

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

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

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

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

⚠️ 危险示例:
// ❌ 绝对禁止!
$password_hash = md5($_POST['password']); // 无盐、不可逆但极不安全

✅ 正确做法:使用 password_hash()(PHP 5.5+),它自动加盐并采用 bcrypt(默认)或 Argon2。

// ✅ 安全哈希(bcrypt)
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);

// 验证时无需关心算法细节
if (password_verify($_POST['input'], $hash)) {
    echo "登录成功";
}

❌ 漏洞二:手动实现加密逻辑

自行拼接 IV、选择弱加密模式(如 ECB)、硬编码密钥等行为,极易导致密文可预测或被篡改。

⚠️ 危险示例:
// ❌ 不安全的 AES-ECB(无 IV,相同明文 → 相同密文)
$key = "1234567890123456"; // 硬编码密钥!
$cipher = openssl_encrypt($data, 'AES-128-ECB', $key);

✅ 推荐方案:使用 openssl_encrypt() + 随机 IV + AEAD 模式(如 AES-256-GCM),并验证完整性。

// ✅ 安全对称加密(AES-256-GCM)
$key = random_bytes(32); // 密钥需安全生成并妥善保管
$iv = random_bytes(12);  // GCM 推荐 12 字节 IV
$tag = ''; // 认证标签(用于防篡改)

$ciphertext = openssl_encrypt(
    $data, 
    'aes-256-gcm', 
    $key, 
    OPENSSL_RAW_DATA, 
    $iv, 
    $tag,
    '', 
    16 // AEAD 认证标签长度
);

// 存储:$iv . $tag . $ciphertext(解密时需完整还原)
$encrypted = $iv . $tag . $ciphertext;

❌ 漏洞三:忽略密钥管理与环境安全

将密钥写死在代码中、通过 URL 传递密钥、或未限制敏感函数(如 eval())——这些都可能让加密形同虚设。

✅ 最佳实践:

  • 密钥存于环境变量($_ENV['APP_ENCRYPTION_KEY'])或专用密钥管理服务(如 HashiCorp Vault);
  • 禁用危险函数:disable_functions = exec,passthru,shell_exec,system,eval(php.ini);
  • 敏感操作启用 HTTPS,防止密钥/密文在传输中泄露。

安全不是功能,而是持续的过程。始终优先选用 PHP 内置的安全原语(password_*, random_bytes(), hash_equals()),拒绝“自己造轮子”。记住:加密失败往往无声无息,而漏洞一旦爆发,代价远超开发成本。

```