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

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

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

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

✅ 对称加密:高效处理敏感数据

适用场景:用户密码临时加密、API 请求体签名、数据库字段加密(如手机号、邮箱)、会话令牌保护等——要求高性能、高频次加解密。

推荐使用 libsodium(PHP 7.2+ 内置,更安全易用):

<?php
// 生成随机密钥(生产环境请安全存储!)
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES); // 32 字节

// 加密
$message = "user_id=12345&plan=premium&expires=2025-12-31";
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // 24 字节随机数
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);

// 解密
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo $decrypted; // 输出原始明文
?>
⚠️ 注意:密钥必须严格保密且长期复用(如存于环境变量或 KMS),切勿硬编码;每次加密需使用新 nonce。

✅ 非对称加密:解决密钥分发与身份认证

适用场景:JWT 签名验证、API 身份鉴权(如 OAuth 2.0 客户端证书)、数字信封(用公钥加密对称密钥)、代码签名等——核心解决“如何安全传递密钥”问题。

使用 OpenSSL 实现 RSA 密钥对加解密示例:

<?php
// 1. 生成密钥对(仅首次执行)
$privateKey = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA
]);
openssl_pkey_export($privateKey, $privatePEM);
$publicKey = openssl_pkey_get_details($privateKey)['key'];

// 2. 公钥加密(客户端/前端)
$plaintext = "session_token=abc123&role=admin";
openssl_public_encrypt($plaintext, $encrypted, $publicKey);
$encoded = base64_encode($encrypted); // 便于传输

// 3. 私钥解密(服务端)
openssl_private_decrypt(base64_decode($encoded), $decrypted, $privatePEM);
echo $decrypted; // 恢复明文
?>

📌 场景对比速查表

  • 对称加密快、省资源:适合加密大量数据(如日志、配置、缓存)
  • 非对称加密安全、免密钥交换:适合签名验签、身份认证、密钥协商(如 TLS 握手)
  • 最佳实践:混合使用!例如用 RSA 加密 AES 密钥,再用 AES 加密业务数据(即“数字信封”模式)

安全无捷径:始终启用 error_reporting(0) 避免密钥泄露;优先选用 sodium(抗侧信道攻击);密钥轮换与审计不可少。加密不是银弹,但正确选型是构建可信系统的坚实起点。

```