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

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

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

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

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

适用场景:API 请求体加密、数据库字段脱敏、Session 数据保护等——要求高性能、低延迟的本地或可信通道内加密。

推荐使用现代、安全的 libsodium(PHP 7.2+ 内置):

<?php
// 加密(发送方)
$key = sodium_crypto_secretbox_keygen();
$nonce = sodium_crypto_secretbox_noncegen();
$message = 'user_id=12345&token=abcde';
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);

// 解密(接收方,需共享 $key 和 $nonce)
$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo $plaintext; // user_id=12345&token=abcde
?>

💡 优势:速度快(毫秒级)、资源占用低;⚠️ 注意:密钥必须安全分发与存储(如通过环境变量或密钥管理服务)。

✅ 非对称加密:解决身份认证与密钥交换

适用场景:JWT 签名验证、API 客户端身份鉴权、HTTPS 握手中的密钥协商、数字签名等——核心解决“如何安全传递对称密钥”或“如何验证消息来源”。

示例:用 RSA 签名验证请求完整性(服务端验签):

<?php
// 服务端加载公钥(从文件或配置)
$publicKey = openssl_pkey_get_public("-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu...-----END PUBLIC KEY-----");

// 接收客户端传来的签名与原始数据
$data = $_POST['data'];      // 如 JSON 字符串
$signature = base64_decode($_POST['sig']);

// 验证签名
$result = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
if ($result === 1) {
    echo "✅ 请求合法,来源可信";
} else {
    http_response_code(401);
    echo "❌ 签名无效,拒绝访问";
}
?>

💡 关键价值:无需共享私钥即可验证身份;常与对称加密结合——如 TLS 中先用 RSA 协商 AES 密钥,再用 AES 加密后续通信。

最佳实践建议:
• 敏感字段(密码、手机号)优先哈希(password_hash())而非加密;
• 对称加密选 sodium_crypto_secretbox(AEAD 模式,防篡改);
• 非对称加密避免自实现 RSA 填充,直接使用 openssl_sign/verifysodium_crypto_sign
• 永远不要硬编码密钥,使用环境变量 + 密钥管理服务(如 HashiCorp Vault)。

安全不是功能,而是贯穿设计、开发与运维的持续实践。理解加密原语的本质与边界,才能让 PHP 应用在真实世界中真正可靠。

```