PHP 对称加密与非对称加密应用场景
在 Web 开发中,数据安全至关重要。PHP 提供了丰富的加密扩展(如 openssl、sodium),支持对称与非对称加密。二者适用场景不同,混用不当反而引入风险。
✅ 对称加密:高效传输敏感数据
特点:加解密使用同一密钥,速度快,适合大量数据加密。
典型场景:用户密码重置 Token、API 请求体加密、数据库字段脱敏。
推荐使用现代、认证的 AEAD 模式(如 chacha20-poly1305)或 AES-GCM:
<?php
// 使用 OpenSSL AES-256-GCM(PHP 7.1+)
function encryptAes($plaintext, $key) {
$iv = random_bytes(12); // GCM 推荐 12 字节 IV
$cipher = 'aes-256-gcm';
$tag = '';
$ciphertext = openssl_encrypt(
$plaintext, $cipher, $key, OPENSSL_RAW_DATA, $iv, $tag, '', 16
);
return base64_encode($iv . $tag . $ciphertext);
}
function decryptAes($encoded, $key) {
$data = base64_decode($encoded);
$iv = substr($data, 0, 12);
$tag = substr($data, 12, 16);
$ciphertext = substr($data, 28);
$cipher = 'aes-256-gcm';
return openssl_decrypt($ciphertext, $cipher, $key, OPENSSL_RAW_DATA, $iv, $tag);
}
$key = hash('sha256', 'my-secret-salt', true); // 32 字节密钥
$token = encryptAes('user_id=123&exp=1735689000', $key);
echo "加密 Token: $token\n";
echo "解密结果: " . decryptAes($token, $key) . "\n";
?>
✅ 非对称加密:安全交换密钥与数字签名
特点:公钥加密、私钥解密(或反之),速度慢,不适用于大数据。
典型场景:JWT 签名验证、API 身份认证、安全传输对称密钥。
示例:用 RSA 签名验证请求完整性(替代简单哈希):
<?php
// 生成密钥对(生产环境请用 openssl_pkey_new() 或预生成)
$privateKey = <<
⚠️ 安全提醒:
• 对称密钥必须严格保密,禁止硬编码;建议使用环境变量 + 密钥管理服务(如 AWS KMS)。
• 非对称加密仅用于签名/验签或加密小量数据(如 AES 密钥);大文本请先用对称加密,再用 RSA 加密该密钥。
• 始终优先选用
sodium_crypto_secretbox()(PHP 7.2+)替代自实现 AES —— 它自动处理 nonce、认证与防侧信道攻击。
理解“什么场景用什么加密”,比掌握算法本身更重要。安全不是功能,而是贯穿设计、开发与运维的持续实践。
```