【ZeroRange WebRTC】对称加密 vs 非对称加密(从原理到实践)
对称加密 vs 非对称加密(从原理到实践,图文并貌)
本文系统讲解对称加密与非对称加密的原理、差异与协同用法,覆盖常见算法(AES-GCM、ChaCha20-Poly1305、RSA-OAEP/RSA-PSS、ECDSA/Ed25519、ECDH/ECDHE)、随机数与密钥管理、协议与工程落地(TLS/DTLS、信封加密)。
概览:两类加密的核心区别
- 对称加密(Symmetric):同一把“密钥”加密与解密;速度快、适合大数据;密钥分发是难点。
- 非对称加密(Asymmetric):使用“公钥/私钥”对;公钥加密或验签,私钥解密或签名;适合密钥协商与身份认证。
对称加密详解(AES/ChaCha20)
- 模式与安全性:
- AES-CBC:需随机 IV;不含完整性,容易受填充攻击;不推荐单独使用。
- AES-CTR:流模式,需唯一 nonce;不含完整性;慎用。
- AES-GCM(AEAD):同时提供保密与完整性(加密+鉴别),需唯一 nonce;现代首选。
- ChaCha20-Poly1305(AEAD):移动端或无 AES 硬件加速时优先。
- 随机数与nonce/IV:
- GCM/ChaCha20 需保证 nonce 唯一;重复会破坏安全性(GCM 会泄露密钥相关信息)。
- 认证数据(AAD):
- 可对“协议头部”等不加密但需鉴别的数据进行认证,提升整体完整性。
示例(Node.js AES-GCM):
import crypto from 'crypto';
function aesGcmEncrypt(key, plaintext, aad) {const iv = crypto.randomBytes(12); // 96-bit nonceconst cipher = crypto.createCipheriv('aes-256-gcm', key, iv);if (aad) cipher.setAAD(aad);const enc = Buffer.concat([cipher.update(plaintext), cipher.final()]);const tag = cipher.getAuthTag();return { iv, enc, tag };
}
function aesGcmDecrypt(key, {iv, enc, tag}, aad) {const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);if (aad) decipher.setAAD(aad);decipher.setAuthTag(tag);return Buffer.concat([decipher.update(enc), decipher.final()]);
}
非对称加密详解(RSA/ECC/Ed25519)
- 功能划分:
- 加密/密钥协商:RSA-OAEP(加密)、ECDH/ECDHE(协商共享秘密)。
- 签名/验证:RSA-PSS、ECDSA(P-256/SECP256R1)、Ed25519(EdDSA)。
- 安全建议:
- RSA 使用 OAEP(加密)与 PSS(签名);避免 PKCS#1 v1.5 的旧模式。
- ECDSA 需确保随机数 k 不泄露,建议 RFC 6979(确定性签名);Ed25519 简洁高效,平台支持需确认。
- 密钥长度与曲线:
- RSA ≥ 2048(建议 3072);ECC 常用 P-256;Ed25519 固定参数。
OpenSSL 示例(RSA-OAEP & RSA-PSS):
# 生成 RSA 私钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out rsa.key
# 派生公钥
openssl pkey -in rsa.key -pubout -out rsa.pub
# OAEP 加密/解密(示意)
# 加密
openssl pkeyutl -encrypt -inkey rsa.pub -pubin -in msg.bin -out msg.enc -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
# 解密
openssl pkeyutl -decrypt -inkey rsa.key -in msg.enc -out msg.dec -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
# PSS 签名/验证
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -sign rsa.key -out msg.sig msg.bin
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -verify rsa.pub -signature msg.sig msg.bin
两者如何协同:混合加密与握手协议
- 混合加密(Envelope Encryption):
- 用随机生成的“会话密钥”进行对称加密(快速处理大数据)。
- 用接收方的“公钥”非对称加密会话密钥(解决密钥分发)。
- TLS/DTLS(握手 + 数据):
- 握手:使用 ECDHE 协商共享秘密、用证书(RSA/ECDSA/Ed25519)签名认证身份。
- 数据:派生对称密钥,用 AEAD(如 AES-GCM/ChaCha20-Poly1305)加密与鉴别应用数据。
场景选型与对照
- 大文件/高吞吐数据:对称加密(AES-GCM/ChaCha20-Poly1305)。
- 公开验证的身份与不可否认:数字签名(RSA-PSS/ECDSA/Ed25519)。
- 密钥分发与协商:非对称加密或 ECDH/ECDHE;随后用对称加密保护数据。
- WebRTC/媒体传输:
- 握手:DTLS(证书签名 + 指纹钉扎)→ 派生 SRTP 密钥。
- 数据:SRTP(AES-GCM 或 AES-CTR + HMAC),提供保密与完整性。
在 WebRTC 中的应用(细化)
握手层:非对称 + 证书指纹钉扎
- DTLS 握手使用证书(自签或 CA 证书)进行身份认证,使用 ECDHE 协商共享秘密(非对称)。
- 双方在 SDP 中交换
a=fingerprint(证书哈希),在握手前“钉扎”对端证书,防止中间人替换。 - 握手完成后派生出对称会话密钥,用于数据面加密(SRTP/SRTCP)。
媒体层:对称 AEAD 加密与完整性
- SRTP 加密:
- 首选 AES-GCM(AEAD):同时提供保密与完整性;严格保证 nonce 唯一。
- 兼容模式 AES-CTR + HMAC:保密(CTR)+ 完整性(HMAC);注意密钥与计数管理。
- SRTCP 控制:统计、NACK/PLI/TWCC 等反馈在加密/鉴别保护下传递。
数据通道:SCTP over DTLS(对称保护)
- 数据通道通过 DTLS 会话承载 SCTP:
- 握手层非对称(证书签名与 ECDHE);数据面对称(AEAD)。
- 支持可靠/不可靠、有序/无序;用于云台控制、信令辅助与业务数据。
TURN 与网络穿透:TLS/443 与 HMAC 临时凭证
- 企业网络常封 UDP,WebRTC 回退至
TURN TLS/443:- 与 TURN 的 TLS 建链使用证书与 SNI(非对称握手),媒体仍是 SRTP(对称)。
- TURN 凭证:使用 HMAC 生成短期用户名/口令(对称认证),避免静态凭证滥用。
选型与性能权衡
- 握手层非对称(ECDHE+签名)成本较高,仅用于短期协商;数据面对称(AEAD)高效保护大流量媒体。
- 非对称适合身份与密钥分发;对称适合持续加密与完整性保护;两者协同是现代实时传输的常态。
常见问题与建议
- 指纹被替换(MITM):信令必须
WSS/HTTPS且鉴权;后端按房间/设备白名单校验指纹。 - GCM/ChaCha20 nonce 重复:务必通过计数器或随机策略保证唯一性,避免灾难性泄露。
- RSA v1.5 与 CBC 无 MAC:避免旧模式;优先使用 RSA-PSS 与 AEAD(AES-GCM/ChaCha20-Poly1305)。
- 证书轮转:提前下发新指纹并灰度切换;保持日志与审计以支撑事后追溯。
常见陷阱与最佳实践
- 对称加密:
- 切勿重复使用 GCM/ChaCha20 nonce;避免 CBC 无 MAC;用 AEAD(AES-GCM/ChaCha20-Poly1305)。
- 非对称加密:
- 避免 RSA v1.5;签名用 PSS;确保 ECDSA 随机数安全(或 RFC 6979)。
- 随机数与熵源:
- 使用系统 CSPRNG(crypto.getRandomValues、/dev/urandom);禁止 Math.random 生成密钥或 nonce。
- 密钥管理:
- KMS/HSM/Secrets Manager 管理密钥;定期轮转与吊销;限制权限与审计。
- 证书与指纹:
- SAN/EKU 配置正确;证书自动续期与撤销;指纹(SHA-256)在应用层钉扎与校验。
速查表(简版)
- 对称:
- 代表算法:AES-GCM、ChaCha20-Poly1305
- 优点:快、适合大数据;缺点:密钥分发困难
- 非对称:
- 代表算法:RSA-OAEP/RSA-PSS、ECDSA、Ed25519、ECDH/ECDHE
- 优点:公开验证/密钥协商;缺点:慢、适合小数据或握手
- 协同:
- 握手用非对称,数据用对称;必要时信封加密
参考与延伸阅读
- IETF/NIST:AES-GCM、ChaCha20-Poly1305、RSA-PSS、ECDSA/Ed25519、ECDH/ECDHE
- 工具与库:OpenSSL、BoringSSL、libsodium、Node.js crypto、WebCrypto
- 实践指南:OWASP ASVS、TLS 配置最佳实践、PKI 证书管理
总结:对称加密解决“高效保密”,非对称加密解决“身份与密钥分发”。现代系统将两者协同:用非对称握手与签名建立信任与共享秘密,再以 AEAD 的对称加密保护数据面,从而在性能与安全上取得平衡。
