PHP 对称加密与非对称加密应用场景详解
在 Web 开发中,数据安全至关重要。PHP 提供了多种加密扩展(如 openssl、libsodium),支持对称与非对称加密。二者适用场景不同,混淆使用可能导致安全隐患。
✅ 对称加密:高效保密,适合大量数据
对称加密使用同一密钥加解密,速度快,适用于敏感数据的本地存储或传输加密。
典型场景:用户密码重置 Token、API 请求体加密、数据库字段加密(如手机号)。
<?php
// 使用 OpenSSL AES-256-CBC 对称加密(推荐)
$key = openssl_random_pseudo_bytes(32); // 256-bit 密钥
$iv = openssl_random_pseudo_bytes(16); // IV 必须唯一且不可复用
$data = "user_id=12345&exp=1735689200";
$ciphertext = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);
$encoded = base64_encode($iv . $ciphertext); // IV 需随密文一同保存
// 解密
$decoded = base64_decode($encoded);
$iv_dec = substr($decoded, 0, 16);
$cipher_dec = substr($decoded, 16);
$plaintext = openssl_decrypt($cipher_dec, 'AES-256-CBC', $key, 0, $iv_dec);
echo $plaintext; // user_id=12345&exp=1735689200
?>
⚠️ 注意:密钥必须安全保管(如环境变量或密钥管理服务),绝不可硬编码;每次加密需生成新 IV;避免使用已淘汰算法(如 MD5、DES)。
✅ 非对称加密:解决密钥分发,保障身份可信
非对称加密使用公钥加密、私钥解密,天然解决密钥交换问题,适用于数字签名、JWT 签名、API 身份认证等。
典型场景:JWT 签发验证、支付回调验签、SSH 登录密钥对、OAuth 授权码签名。
<?php
// 生成 RSA 密钥对(生产环境请用 openssl_pkey_new() 或预生成)
$config = ['digest_alg' => 'sha256', 'private_key_bits' => 2048];
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey);
$publicKey = openssl_pkey_get_details($res)['key'];
// 用私钥签名(如 JWT header.payload 的签名)
$payload = '{"sub":"user123","iat":'.time().'}';
openssl_sign($payload, $signature, $privateKey, 'SHA256');
// 用公钥验签(如 API 接收方验证请求来源)
$result = openssl_verify($payload, $signature, $publicKey, 'SHA256');
var_dump($result === 1); // true 表示签名有效
?>
📌 实战建议
- 优先选用 libsodium(PHP 7.2+ 内置):`sodium_crypto_secretbox()`(对称)、`sodium_crypto_sign()`(非对称),更安全、更易用;
- 绝不手写加密逻辑:避免自定义填充、IV 生成或签名拼接;
- 敏感操作双因子:如登录既校验密码(对称哈希),又验证设备指纹(非对称签名);
- HTTPS 是基础:加密前确保传输层已通过 TLS 加密。
理解“对称加密保内容,非对称加密保身份”,才能在 PHP 应用中构建真正可靠的安全防线。
```