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

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

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

在 Web 开发中,数据安全至关重要。PHP 提供了丰富的加密扩展(如 opensslsodium),支持对称与非对称加密。二者适用场景不同,混用不当反而引入风险。

✅ 对称加密:高效传输敏感数据

特点:加解密使用同一密钥,速度快,适合大量数据加密。
典型场景:用户密码重置 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 应用的基石。

```