PHP 对称加密与非对称加密应用场景
在 Web 开发中,数据安全至关重要。PHP 提供了成熟的加密扩展(如 openssl 和 sodium),支持两类核心加密方式:**对称加密**(同一密钥加解密)和**非对称加密**(公钥/私钥配对)。二者适用场景截然不同,合理选择是安全架构的关键。
✅ 对称加密:高效传输敏感数据
适用场景: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);
?>
💡 最佳实践提示:
• 优先选用
• 永远避免自实现加密逻辑;
• 对称加密务必使用认证模式(如 AES-GCM),防止篡改;
• 非对称加密仅适合小数据(RSA ≤ 245 字节),大内容应先哈希或采用混合加密。
• 优先选用
sodium 扩展(PHP 7.2+ 内置),API 更简洁、默认抗侧信道攻击;• 永远避免自实现加密逻辑;
• 对称加密务必使用认证模式(如 AES-GCM),防止篡改;
• 非对称加密仅适合小数据(RSA ≤ 245 字节),大内容应先哈希或采用混合加密。
理解二者边界,才能构建真正健壮的安全体系:**对称加密守护数据“内容”,非对称加密守护数据“信任”。** 在 PHP 中善用 openssl 与 sodium,让安全成为代码的自然延伸。