密码学 (Cryptography)¶
R-VPN 使用现代密码学原语确保安全和隐私。
密码学技术栈¶
| 层级 | 算法 | 用途 |
|---|---|---|
| 密钥协商 | X3DH | 认证密钥交换 |
| 消息加密 | Double Ratchet | 前向安全 |
| 对称加密 | ChaCha20-Poly1305 | 数据加密 |
| 哈希 | SHA-256 | 密钥派生 |
| 签名 | Ed25519 | 身份认证 |
密钥协商 (X3DH)¶
扩展三重迪菲-赫尔曼(X3DH)协议提供认证密钥交换。
流程¶
- 客户端通过 HTTPS 获取服务器的预密钥包
- 客户端生成临时密钥对
- 双方计算共享密钥:
- DH1 = 身份密钥(客户端)× 签名预密钥(服务器)
- DH2 = 临时密钥(客户端)× 身份密钥(服务器)
- DH3 = 临时密钥(客户端)× 签名预密钥(服务器)
- DH4 = 临时密钥(客户端)× 一次性预密钥(服务器)
- 通过 HKDF 派生共享密钥
安全特性¶
- 前向安全 - 长期密钥泄露不会暴露过去的会话
- 认证 - 通过签名预密钥验证服务器身份
- 可否认性 - 通信不需要持久化密钥
双棘轮算法 (Double Ratchet)¶
X3DH 之后,双棘轮算法提供持续的密钥演进。
对称棘轮¶
每条消息使用从链密钥派生的唯一密钥:
这提供前向安全 - 泄露一个消息密钥不会暴露过去的密钥。
DH 棘轮¶
定期生成新的迪菲-赫尔曼密钥对:
这提供后妥协安全 - 即使密钥被泄露,未来的密钥仍然是安全的。
数据加密¶
ChaCha20-Poly1305¶
所有数据使用 ChaCha20-Poly1305 加密:
- ChaCha20 - Daniel Bernstein 设计的流密码
- Poly1305 - 消息认证码
- 组合为 AEAD(关联数据的认证加密)
为什么选择 ChaCha20-Poly1305?¶
| 特性 | ChaCha20-Poly1305 | AES-GCM |
|---|---|---|
| 速度(无硬件加速) | 快 | 慢 |
| 侧信道攻击 | 天然恒定时间 | 需要小心处理 |
| 移动设备 | 低功耗 | 较高功耗 |
| TLS 1.3 | 强制支持 | 强制支持 |
密钥管理¶
身份密钥¶
- 类型: Ed25519(签名), X25519(DH)
- 生命周期: 长期(数月至数年)
- 存储: 安全文件系统,推荐使用硬件令牌
签名预密钥¶
- 类型: X25519
- 生命周期: 约 1 周
- 轮换: 自动
- 签名: 使用身份密钥的 Ed25519 签名
一次性预密钥¶
- 类型: X25519
- 生命周期: 单次使用
- 池大小: 100 个预生成密钥
- 用途: 提供额外的前向安全
密钥派生¶
HKDF(基于 HMAC 的密钥派生函数)在整个系统中使用:
// X3DH 根密钥
根密钥 = HKDF(盐, 输入密钥材料, "R-VPN-v1 X3DH", 32)
// 消息密钥
消息密钥 = HKDF(链密钥, "R-VPN-v1 Message", 32)
威胁缓解¶
| 威胁 | 缓解措施 |
|---|---|
| 流量分析 | TLS 1.3, WebSocket 掩码 |
| 重放攻击 | 随机数, 序列号 |
| 中间人攻击 | X3DH 认证 |
| 密钥泄露 | 双棘轮算法 |
| 量子计算 | 后量子混合模式(未来) |
实现¶
所有密码学功能使用经过良好审计的 Rust 库实现:
ring- 底层密码学原语x25519-dalek- X25519 DHed25519-dalek- Ed25519 签名chacha20poly1305- AEAD 密码hkdf- 密钥派生
最佳实践¶
- 保护密钥安全 - 使用文件权限、加密
- 定期轮换 - 预密钥每周轮换
- 验证签名 - 始终验证服务器密钥
- 使用强 TLS - 仅使用 TLS 1.3
- 监控异常 - 注意异常流量模式
下一步¶
- 威胁模型 - 了解安全目标