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 = '-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD...';
$publicKey = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu...';
// 签名(服务端)
$data = json_encode(['order_id' => 'ORD-2024-789', 'amount' => 99.9]);
$signature = '';
openssl_sign($data, $signature, $privateKey, 'sha256WithRSAEncryption');
$signatureB64 = base64_encode($signature);
// 验证(接收方)
$isValid = openssl_verify($data, base64_decode($signatureB64), $publicKey, 'sha256WithRSAEncryption');
var_dump($isValid === 1); // true 表示签名有效
?>
⚠️ 安全提示:
• 对称密钥需安全存储(如环境变量或密钥管理服务),切勿硬编码;
• 非对称加密仅用于小数据(≤245 字节 RSA-2048),大内容应先哈希或结合对称加密(混合加密);
• 优先选用
• 对称密钥需安全存储(如环境变量或密钥管理服务),切勿硬编码;
• 非对称加密仅用于小数据(≤245 字节 RSA-2048),大内容应先哈希或结合对称加密(混合加密);
• 优先选用
sodium_crypto_secretbox()(libsodium)替代 OpenSSL 手动实现,更难出错。
理解加密边界,才能构建真正可信的安全链路——对称加密护航数据“体”,非对称加密守护身份与信任“魂”。
```