跳转至

密码学 (Cryptography)

R-VPN 使用现代密码学原语确保安全和隐私。

密码学技术栈

层级 算法 用途
密钥协商 X3DH 认证密钥交换
消息加密 Double Ratchet 前向安全
对称加密 ChaCha20-Poly1305 数据加密
哈希 SHA-256 密钥派生
签名 Ed25519 身份认证

密钥协商 (X3DH)

扩展三重迪菲-赫尔曼(X3DH)协议提供认证密钥交换。

流程

  1. 客户端通过 HTTPS 获取服务器的预密钥包
  2. 客户端生成临时密钥对
  3. 双方计算共享密钥:
  4. DH1 = 身份密钥(客户端)× 签名预密钥(服务器)
  5. DH2 = 临时密钥(客户端)× 身份密钥(服务器)
  6. DH3 = 临时密钥(客户端)× 签名预密钥(服务器)
  7. DH4 = 临时密钥(客户端)× 一次性预密钥(服务器)
  8. 通过 HKDF 派生共享密钥

安全特性

  • 前向安全 - 长期密钥泄露不会暴露过去的会话
  • 认证 - 通过签名预密钥验证服务器身份
  • 可否认性 - 通信不需要持久化密钥

双棘轮算法 (Double Ratchet)

X3DH 之后,双棘轮算法提供持续的密钥演进。

对称棘轮

每条消息使用从链密钥派生的唯一密钥:

消息密钥, 链密钥 = HKDF(链密钥, 消息编号)

这提供前向安全 - 泄露一个消息密钥不会暴露过去的密钥。

DH 棘轮

定期生成新的迪菲-赫尔曼密钥对:

新共享密钥 = DH(我方私钥, 对方公钥)
根密钥, 链密钥 = HKDF(新共享密钥)

这提供后妥协安全 - 即使密钥被泄露,未来的密钥仍然是安全的。

数据加密

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 DH
  • ed25519-dalek - Ed25519 签名
  • chacha20poly1305 - AEAD 密码
  • hkdf - 密钥派生

最佳实践

  1. 保护密钥安全 - 使用文件权限、加密
  2. 定期轮换 - 预密钥每周轮换
  3. 验证签名 - 始终验证服务器密钥
  4. 使用强 TLS - 仅使用 TLS 1.3
  5. 监控异常 - 注意异常流量模式

下一步