这份综合指南深入探讨了现代安全通信系统中使用的高级加密概念、算法和协议。非常适合开发者和安全专业人士。
注意:本指南假设你已经熟悉基础加密概念。如果你是初学者,请从我们的初学者安全建议开始。
对称加密算法
AES (Advanced Encryption Standard)
对称加密的黄金标准,2001年被美国政府采用。
主要特性
- 密钥大小:128、192 或 256 位
- 区块大小:128 位
- 轮数:根据密钥大小分别为 10、12 或 14 轮
- 性能:高度优化,支持硬件加速
常见模式
- GCM (Galois/Counter Mode):认证加密,推荐用于大多数场景
- CBC (Cipher Block Chaining):传统模式,需要单独的 MAC
- CTR (Counter):可并行化,用于某些协议
ChaCha20
由 Daniel J. Bernstein 设计的现代流密码,作为 AES 替代方案越来越受欢迎。
优势
- 在没有硬件加速的设备上比 AES 更快
- 恒定时间实现(抗时序攻击)
- 设计简单,更容易安全实现
- 与 Poly1305 配合使用实现认证加密
非对称加密
RSA (Rivest-Shamir-Adleman)
广泛用于密钥交换和数字签名。
关键考虑因素
- 最小密钥大小:2048 位(建议使用 4096 位以确保长期安全)
- 性能:与对称加密相比计算成本高
- 填充方案:加密使用 OAEP,签名使用 PSS
- 量子威胁:容易受到量子计算机攻击(Shor 算法)
Elliptic Curve Cryptography (ECC)
比 RSA 更高效的替代方案,在更小的密钥大小下提供同等安全性。
流行的曲线
- Curve25519:专为 ECDH 密钥交换设计,广泛采用
- Ed25519:用于数字签名,应用于 SSH、GPG
- P-256 (secp256r1):NIST 标准,广泛支持
- P-384、P-521:更高安全级别
相比 RSA 的优势
- 256 位 ECC ≈ 3072 位 RSA 安全性
- 计算速度更快
- 密钥和签名更小
- 带宽和存储需求更低
密钥交换协议
Diffie-Hellman (DH)
允许双方通过不安全的通道建立共享密钥。
变体
- 经典 DH:原始实现
- ECDH:椭圆曲线版本(更高效)
- X25519:使用 Curve25519 的现代 ECDH
Perfect Forward Secrecy (PFS)
确保即使长期密钥被泄露,过去的通信仍然安全。
实现方式
- 为每个会话生成临时密钥对
- 使用后销毁会话密钥
- 用于 TLS 1.3、Signal Protocol 等
哈希函数
SHA-2 系列
- SHA-256:256 位输出,广泛使用
- SHA-384、SHA-512:更高安全级别
- 应用:数字签名、证书验证、密码哈希(配合适当技术)
SHA-3 (Keccak)
- 与 SHA-2 不同的构造(海绵函数)
- 抗长度扩展攻击
- 适用于需要高安全边际的应用
BLAKE2/BLAKE3
- 比 SHA-2 和 SHA-3 更快
- 密码学安全
- BLAKE3:高度可并行化,适合大数据
密钥派生函数 (KDFs)
PBKDF2 (Password-Based Key Derivation Function 2)
- 目的:从密码派生加密密钥
- 迭代次数:最少 100,000 次(OWASP 建议)
- 使用场景:密码存储、密钥派生
Argon2
密码哈希竞赛(2015)的获胜者,推荐用于新应用。
变体
- Argon2id:混合型(推荐用于大多数场景)
- Argon2i:针对侧信道攻击优化
- Argon2d:最大化抵抗 GPU 攻击
scrypt
- 内存困难函数(抗硬件攻击)
- 被 Litecoin、Tarsnap 使用
- 安全性和兼容性的良好平衡
消息认证码 (MACs)
HMAC (Hash-based MAC)
- 将哈希函数与密钥结合
- 提供认证和完整性
- 常见:HMAC-SHA256、HMAC-SHA512
Poly1305
- 一次性认证器
- 与 ChaCha20 配合使用实现认证加密
- 快速且恒定时间
认证加密
为什么重要
单纯的加密不能保证完整性。攻击者可能在不被检测的情况下修改密文。认证加密解决了这个问题。
AEAD (Authenticated Encryption with Associated Data)
- AES-GCM:支持最广泛
- ChaCha20-Poly1305:在移动设备上表现更好
- AES-CCM:用于某些无线协议
数字签名
RSA 签名
- 填充:使用 PSS (Probabilistic Signature Scheme)
- 哈希函数:SHA-256 或更高
- 密钥大小:最少 2048 位
ECDSA (Elliptic Curve Digital Signature Algorithm)
- 比 RSA 签名更小
- 需要谨慎生成随机数(弱 RNG = 密钥泄露)
- 推荐使用确定性变体(RFC 6979)
Ed25519
- 确定性(不需要 RNG)
- 快速签名生成和验证
- 小签名(64 字节)
- 抗侧信道攻击
现代协议
Signal Protocol
最先进的端到端加密协议,被 Signal、WhatsApp、Facebook Messenger 使用。
主要特性
- Double Ratchet:持续更新密钥
- Perfect Forward Secrecy:过去的消息保持安全
- Post-Compromise Security:从密钥泄露中恢复
- 异步:即使接收者离线也能工作
TLS 1.3
传输层安全协议的最新版本。
改进
- 移除了弱算法和密码套件
- 始终提供前向保密
- 更快的握手(1-RTT,可选 0-RTT)
- 加密的 Server Hello
Noise Protocol Framework
用于构建安全通信系统的现代密码学协议框架。
应用
- WireGuard VPN
- Lightning Network
- I2P 消息传递
后量子密码学
威胁
量子计算机可以使用 Shor 算法破解 RSA 和 ECC。对称算法受影响较小,但需要更大的密钥。
NIST 后量子候选算法
- Kyber:基于格的密钥封装
- Dilithium:基于格的数字签名
- SPHINCS+:基于哈希的签名
过渡策略
- 混合方法:结合经典和后量子算法
- 将对称密钥大小增加到 256 位
- 关注 NIST 标准化进程
- 规划算法灵活性
实现最佳实践
不要自己实现加密
使用经过验证的、经过同行评审的库:
- libsodium:高级别,易于使用
- OpenSSL:全面,广泛支持
- BoringSSL:Google 的 OpenSSL 分支
- Ring:Rust 加密库
密钥管理
- 对关键密钥使用硬件安全模块(HSM)
- 实施密钥轮换策略
- 永远不要在源代码中硬编码密钥
- 对多种用途使用密钥派生
- 使用后安全删除内存中的密钥
安全随机数生成
- 使用密码学安全的 RNG (CSPRNG)
- 永远不要使用标准的 rand() 函数
- 操作系统 RNG:/dev/urandom (Linux)、CryptGenRandom (Windows)
- 特定语言:crypto.randomBytes (Node.js)、secrets 模块 (Python)
防止时序攻击
- 对密钥使用恒定时间比较
- 避免基于密钥数据的分支
- 注意缓存时序攻击
- 使用设计有时序攻击抵抗能力的库
测试与验证
安全审计
- 定期渗透测试
- 安全专家代码审查
- 第三方安全审计
- 漏洞赏金计划
合规性
- FIPS 140-2/3:美国政府标准
- Common Criteria:国际安全认证
- PCI DSS:支付卡行业要求
进一步学习资源
书籍
- "Cryptography Engineering" by Ferguson, Schneier, and Kohno
- "Serious Cryptography" by Jean-Philippe Aumasson
- "Applied Cryptography" by Bruce Schneier
在线资源
- Cryptopals Crypto Challenges
- Stanford 密码学课程(Coursera)
- IACR ePrint Archive
- Crypto Stack Exchange
查看实际加密应用:SecretNote 使用 AES-256-GCM 加密和安全密钥派生来保护你的消息。现在就试试吧!