PHP 对称加密与非对称加密应用场景

```html PHP 对称加密与非对称加密应用场景

PHP 对称加密与非对称加密应用场景

在 Web 开发中,数据安全至关重要。PHP 提供了成熟的加密扩展(如 opensslsodium),支持两类核心加密方式:**对称加密**(同一密钥加解密)和**非对称加密**(公钥/私钥配对)。二者适用场景截然不同,合理选择是安全架构的关键。

✅ 对称加密:高效传输敏感数据

适用场景:API 请求体加密、数据库字段脱敏、Session 数据保护等——要求高性能、低延迟,且通信双方可安全共享密钥。

推荐使用 openssl_encrypt()(AES-256-GCM,带认证):

<?php
$key = sodium_crypto_secretbox_keygen(); // 32字节随机密钥
$plaintext = "用户身份证号:11010119900307275X";
$nonce = random_bytes(12); // GCM 需12字节 nonce

$ciphertext = openssl_encrypt(
    $plaintext, 
    'aes-256-gcm', 
    $key, 
    OPENSSL_RAW_DATA, 
    $nonce,
    $tag, // 认证标签(自动输出)
    '', 
    0
);

// 存储或传输:$ciphertext + $nonce + $tag
echo base64_encode($ciphertext . $nonce . $tag);
?>

✅ 非对称加密:安全交换密钥与数字签名

适用场景:JWT 签名验证、API 身份认证(如 OAuth)、敏感密钥分发(如用公钥加密对称密钥)——解决“密钥如何安全传递”问题。

示例:用 RSA 公钥加密会话密钥(混合加密):

<?php
// 生成密钥对(生产环境应离线生成并妥善保管)
$privateKey = openssl_pkey_new(['private_key_bits' => 2048]);
$publicKey = openssl_pkey_get_details($privateKey)['key'];

// 生成随机 AES 密钥(用于后续对称加密)
$aesKey = random_bytes(32);

// 用公钥加密 AES 密钥
openssl_public_encrypt($aesKey, $encryptedAesKey, $publicKey);

// 发送给客户端:$encryptedAesKey(安全) + 后续 AES 加密数据
echo "加密后的会话密钥:" . base64_encode($encryptedAesKey);
?>
💡 最佳实践提示:
• 优先选用 sodium 扩展(PHP 7.2+ 内置),API 更简洁、默认抗侧信道攻击;
• 永远避免自实现加密逻辑;
• 对称加密务必使用认证模式(如 AES-GCM),防止篡改;
• 非对称加密仅适合小数据(RSA ≤ 245 字节),大内容应先哈希或采用混合加密。

理解二者边界,才能构建真正健壮的安全体系:**对称加密守护数据“内容”,非对称加密守护数据“信任”。** 在 PHP 中善用 opensslsodium,让安全成为代码的自然延伸。

```