PHP 对称加密与非对称加密应用场景
在 Web 开发中,数据安全至关重要。PHP 提供了丰富的加密扩展(如 openssl、sodium),支持对称与非对称加密。二者适用场景不同,混用不当反而引入风险。
✅ 对称加密:高效传输敏感数据
特点:加解密使用同一密钥,速度快,适合大量数据加密。
典型场景:用户密码重置 Token、API 请求体加密、Cookie 内容保护。
推荐使用现代、认证的加密模式(如 AES-GCM):
<?php
// 使用 OpenSSL AES-256-GCM(PHP 7.1+)
function encryptSymmetric(string $plaintext, string $key): array {
$iv = random_bytes(12); // GCM 推荐 12 字节 IV
$tag = '';
$ciphertext = openssl_encrypt(
$plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag, '', 16
);
return ['ciphertext' => base64_encode($ciphertext), 'iv' => base64_encode($iv), 'tag' => base64_encode($tag)];
}
function decryptSymmetric(array $data, string $key): ?string {
$ciphertext = base64_decode($data['ciphertext']);
$iv = base64_decode($data['iv']);
$tag = base64_decode($data['tag']);
return openssl_decrypt($ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
}
$key = hash('sha256', 'my-secret-salt', true); // 32 字节密钥
$encrypted = encryptSymmetric('order_id=12345&amount=99.99', $key);
var_dump($encrypted);
// 解密后可安全用于支付回调校验
?>
✅ 非对称加密:身份认证与密钥交换
特点:公钥加密、私钥解密,安全性高但性能差,不适合大数据。
典型场景:JWT 签名验证、API 身份签名、安全传输对称密钥。
示例:用 RSA 签名验证请求来源(如微信支付回调):
<?php
// 生成密钥对(生产环境应离线生成并妥善保管)
// openssl genrsa -out private.key 2048
// openssl rsa -in private.key -pubout -out public.key
$privateKey = openssl_pkey_get_private('file://private.key');
$publicKey = openssl_pkey_get_public('file://public.key');
$message = 'timestamp=1712345678&nonce=abc123&data={"order":"paid"}';
openssl_sign($message, $signature, $privateKey, OPENSSL_ALGO_SHA256);
// 发送方传 message + base64_encode($signature)
// 接收方用公钥验证:
$isValid = openssl_verify($message, base64_decode($signature), $publicKey, OPENSSL_ALGO_SHA256) === 1;
echo $isValid ? '✅ 签名有效' : '❌ 签名无效';
?>
⚠️ 关键提醒:
• 永远不要自己实现加密逻辑;优先使用
• 对称密钥需安全存储(如环境变量/密钥管理服务),禁止硬编码。
• 非对称私钥必须严格保密,公钥可公开分发。
• 永远不要自己实现加密逻辑;优先使用
libsodium(PHP 7.2+ 内置)或成熟 OpenSSL 封装。• 对称密钥需安全存储(如环境变量/密钥管理服务),禁止硬编码。
• 非对称私钥必须严格保密,公钥可公开分发。
总结:对称加密是「快递员」——快而可靠,适合运货(数据);非对称加密是「数字身份证」——慢而权威,适合验身(身份)。理解边界,组合使用,才是构建安全 PHP 应用的基石。
```