WireGuard:ChaCha20 与 Curve25519 VPN
探索 WireGuard 的精简密码学设计,了解其对 ChaCha20-Poly1305、Curve25519 和 BLAKE2 的使用。
WireGuard:ChaCha20 与 Curve25519 VPN 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
WireGuard 设计理念
WireGuard 的设计首要目标是极致简洁。它的代码库约有 4,000 行,而 OpenVPN 有 70,000 行,strongSwan IPsec 则超过 400,000 行。代码行数越少,潜在漏洞就越少,审计范围也足够小,单个工程师即可进行彻底审查。这种简洁是有意作出的安全选择,而不是功能限制。
固定密码学原语
与 OpenVPN 和 IPsec 不同,WireGuard 不会协商密码算法。每个 WireGuard 连接都使用同一组固定原语:Curve25519 用于 ECDH,ChaCha20-Poly1305 用于认证加密,BLAKE2s 用于哈希,SipHash-2-4 用于哈希表安全。这消除了密码算法协商,也就消除了一整类降级攻击。
Noise 协议框架握手
WireGuard 实现了 Noise 协议框架中的 Noise_IKpsk2 握手模式。该框架为构建具有可证明安全属性的密钥交换协议提供了一种系统化方法。IKpsk2 模式使用静态密钥对和临时密钥对,并可选择使用预共享密钥来增强抗量子能力,在一次往返通信中完成握手。
Curve25519 密钥交换
Curve25519 是由 Daniel Bernstein 设计的一种椭圆曲线,兼具高性能和高安全性。WireGuard 使用它进行椭圆曲线迪菲-赫尔曼(ECDH)密钥协商。每个对等方都有一个用于长期身份标识的静态 Curve25519 密钥对,握手过程中还会使用临时密钥对来提供前向保密。Curve25519 运算采用常数时间实现,可抵御计时攻击。
ChaCha20-Poly1305 数据加密
WireGuard 使用 ChaCha20-Poly1305 对所有数据包进行加密,这是一种认证加密算法。在没有 AES 硬件加速的设备(智能手机、嵌入式设备)上,ChaCha20 这种流密码的运行速度极快。Poly1305 提供认证标签。组合后的 AEAD 构造可确保在解密之前检测出对密文的任何篡改。
BLAKE2s 哈希
BLAKE2s 是一种针对 32 位平台和短消息优化的密码学哈希函数。WireGuard 在握手的密钥派生步骤以及会话标识符计算中使用它。在大多数平台上,BLAKE2s 的速度快于 SHA-256,同时提供同等的安全性。它被设计为 SHA-3 入围算法 BLAKE 的后继者。
静态与临时密钥对
WireGuard 对等方拥有一个充当长期身份标识的静态密钥对。公钥会在配置过程中通过带外方式交换,并作为对等方标识符。在每次握手期间,双方还会生成临时密钥对。静态密钥与临时密钥之间的 ECDH,再结合临时密钥对之间的 ECDH,同时提供身份验证和前向保密。
密码密钥路由
WireGuard 实现了密码密钥路由:配置中的每个对等方都会指定可通过该对等方访问的 IP 地址(允许的 IP)。当出站数据包匹配某个对等方的允许 IP 时,数据包就会加密并发送给该对等方。入站数据包会被解密,并且其源 IP 必须匹配所使用密钥对应的允许 IP;否则数据包会被丢弃。密钥定义了路由表。
基于计时器的连接管理
WireGuard 没有持久连接这一概念。如果没有流量传输,就不会发送数据包,VPN 实际上会从网络中消失。有流量需要发送时,才会按需触发握手。可配置的 PersistentKeepalive 设置会定期发送空数据包,以维护位于 NAT 路由器之后的设备的 NAT 映射。
Linux 内核中的 WireGuard
WireGuard 已在 5.6 版本中合并进入 Linux 内核主线,该版本于 2020 年 3 月发布。在内核空间运行使 WireGuard 能够直接访问内核网络堆栈和密码硬件,因此吞吐量高于用户空间 VPN 实现。在其他平台(Windows、macOS、iOS、Android)上,WireGuard 通过跨平台实现运行于用户空间。
WireGuard 性能比较
基准测试始终显示,WireGuard 的吞吐量比 OpenVPN 高出 3 至 4 倍。在配备 AES 硬件的系统上,使用 AES-NI 硬件加速的 IPsec 具备与 WireGuard 相当的性能。在没有 AES-NI 的 ARM 设备上,WireGuard 的 ChaCha20 性能显著优于基于 AES 的替代方案。更低的 CPU 使用率也意味着移动设备拥有更长的电池续航时间。
WireGuard 密码学原语
WireGuard 使用哪种算法加密数据包?
WireGuard 回顾
WireGuard 回顾:约 4,000 行代码,最大限度缩小攻击面;使用固定原语(不进行协商);采用结合 Curve25519 的 Noise IKpsk2 握手;使用 ChaCha20-Poly1305 处理数据;使用 BLAKE2s 进行哈希;通过密码密钥路由将 IP 范围与公钥关联;通过临时密钥提供前向保密;集成内核以实现最高性能;采用无状态连接模型,并按需执行握手。
常见问题解答
「WireGuard:ChaCha20 与 Curve25519 VPN」课时是免费的吗?
是的 — 「WireGuard:ChaCha20 与 Curve25519 VPN」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「WireGuard:ChaCha20 与 Curve25519 VPN」这节课中我会学到什么?
探索 WireGuard 的精简密码学设计,了解其对 ChaCha20-Poly1305、Curve25519 和 BLAKE2 的使用。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「WireGuard:ChaCha20 与 Curve25519 VPN」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- IPsec:IKEv2、ESP 与 AH 协议
- WireGuard:ChaCha20 与 Curve25519 VPN
- OpenVPN:基于 TLS 的 VPN 架构
- VPN 协议比较:安全性与性能