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

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

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

在 Web 开发中,数据安全至关重要。PHP 提供了成熟的加密扩展(如 opensslsodium),支持两类核心加密方式:**对称加密**(同一密钥加解密)和**非对称加密**(公钥/私钥配对)。二者适用场景截然不同,合理选择是安全架构的关键。

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

适用场景:API 请求体加密、数据库字段脱敏、Session 数据保护等——要求高性能、低延迟,且通信双方可安全共享密钥。

推荐使用 openssl_encrypt()(AES-256-GCM,带认证):

<?php
$key = sodium_crypto_secretbox_keygen(); // 32字节随机密钥
$plaintext = "用户身份证号:11010119900307275X";
$nonce = random_bytes(12); // GCM 需12字节 nonce

$ciphertext = openssl_encrypt(
    $plaintext, 
    'aes-256-gcm', 
    $key, 
    OPENSSL_RAW_DATA, 
    $nonce,
    $tag, // 认证标签
    '', 
    16 // AEAD tag 长度
);

// 存储:$nonce . $tag . $ciphertext(共需传递三部分)
$packet = $nonce . $tag . $ciphertext;

// 解密
$nonce = substr($packet, 0, 12);
$tag   = substr($packet, 12, 16);
$cipher = substr($packet, 28);
$decrypted = openssl_decrypt($cipher, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $tag);
echo $decrypted; // 输出原文
?>
💡 提示:避免使用已淘汰的 mcrypt;优先选用 AES-GCM 或 ChaCha20-Poly1305(PHP 7.2+),确保机密性与完整性。

✅ 非对称加密:解决密钥分发与身份认证

适用场景:JWT 签名验证、API 请求签名、数字信封(混合加密)、SSH 密钥登录——无需共享密钥,天然支持身份鉴别。

典型用法:用私钥签名,公钥验签(如 OAuth 2.0 的 JWT):

<?php
// 生成密钥对(生产环境请用 openssl_pkey_new() 并妥善保管私钥)
$privateKey = openssl_pkey_get_private("file://private.key");
$publicKey  = openssl_pkey_get_public("file://public.key");

$data = json_encode(['uid' => 1001, 'exp' => time() + 3600]);
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);

// 发送 $data 和 $signature 给客户端
// 客户端用公钥验证:
$result = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
var_dump($result === 1); // true 表示签名有效
?>

📌 实战建议

  • 绝不硬编码密钥:使用环境变量或密钥管理服务(如 AWS KMS);
  • 混合使用更安全:用非对称加密传输对称密钥(数字信封),再用对称加密处理大数据;
  • 优先选 libsodium:PHP 7.2+ 内置,API 更简洁(sodium_crypto_box(), sodium_crypto_pwhash());
  • 警惕时序攻击:验签/比较时使用 sodium_memcmp() 替代 ===

加密不是银弹,但理解其边界与组合逻辑,能让 PHP 应用在合规(如 GDPR、等保2.0)与实战安全间取得坚实平衡。

```