跳到主要内容

你按下“连接”的那一刻,你的手机和 VPN 服务器从未见过面。它们没有共同的秘密,彼此之间的每条消息都要穿过陌生人运营的网络。可是不到一秒钟,它们就在发送没有任何陌生人能读懂的数据。让这件事成为可能的技巧,叫做密钥交换,是实用密码学中最精巧的想法之一。

本文用通俗的话讲解 VPN 密钥交换是如何工作的:混合颜料的比喻,一个可以用计算器验证的小数字真实计算,同样的思路怎样放大到现代椭圆曲线,为什么没有身份认证的交换是不够的,以及共享秘密怎样变成真正加密流量的密钥。想知道加密算法如何使用这些密钥,请读 VPN 加密是什么。这里我们只关注秘密是怎样诞生的。

问题:在公开场合约定秘密

加密需要共享密钥。如果你和服务器持有同一个密钥,就可以加密和解密。困难在于怎样把这个密钥送到双方手里。通过网络明文发送,等于交给所有观察者;加密发送,又需要一个你还没有的密钥。

历史上,这靠当面交换或可信的信使解决。但对于数十亿次、彼此素不相识的连接来说,这行不通。1976 年,Whitfield Diffie 和 Martin Hellman 发表了解决这一问题的方法:它让双方通过任何人都能偷听的公开对话,建立起一个共享秘密。

要记住的词是约定。在经典的交换里,没有哪一方选好最终密钥再发送出去。每一方贡献一个私有的部分,密钥由两者结合而产生。没有任何秘密真正穿过线路。

混合颜料的比喻

经典的比喻用颜料。假设爱丽丝和鲍勃想得到一个共同的秘密颜色,而伊芙在观察他们交换的一切。

  1. 两人公开约定从黄色开始。伊芙看见了。
  2. 爱丽丝私下选了红色作为自己的秘密颜色,混进黄色里。鲍勃私下选了蓝色,做同样的事。
  3. 两人公开交换混好的颜料罐。伊芙看见了两罐混合物。
  4. 爱丽丝把自己的秘密红色加进鲍勃的罐子,鲍勃把自己的秘密蓝色加进爱丽丝的罐子。
  5. 现在两个罐子里都是黄加红加蓝,颜色相同。

伊芙手里只有黄色和两罐混合物。把混合好的颜料再分开非常困难,所以她还原不出红色或蓝色,也做不出最终的颜色。数学版本里,“混合”被换成一种正向容易、反向极难的运算。

用小数字做一次真实计算

下面用真实的数字演示同一思路。数字很小,方便你手算验证;真实系统使用的数值要大得多。

用到的运算叫“模幂”:先把一个数乘方,再只保留除以某个固定数后的余数。

公开值(所有人可见):模数 p = 23,底数 g = 5。

步骤 爱丽丝 鲍勃
选择私有数字 a = 6 b = 15
计算公开值 A = 5^6 mod 23 = 8 B = 5^15 mod 23 = 19
通过网络发送 发送 8 发送 19
与对方的值结合 19^6 mod 23 = 2 8^15 mod 23 = 2

双方最后都得到 2,而过程中从未发送过 6、15 或 2。伊芙看到的是 23、5、8 和 19。要得到秘密,她必须从公开数字中算出爱丽丝的 6 或鲍勃的 15。模数只有 23 时,她只要逐个试指数,几次就能找到 6,因为一共只有 22 种可能。

现在把规模放大。真实的有限域交换中,模数是一个约 2,048 位的数,私有指数大小相仿。试错变得不可能,已知最巧妙的方法也远远够不到。这种单向性质,即正向容易、反向不可行,就是整个交换安全性的全部来源。

从小数字到椭圆曲线

大多数现代 VPN 和网站并不使用 2,048 位的版本,而是使用椭圆曲线 Diffie-Hellman(ECDH):其中的“数字”是数学曲线上的点,“乘方”变成了重复的点加法。

重要的是它在实践中的影响。

  • 密钥短得多。 流行的曲线 X25519 使用 32 字节的公开值,而同等强度的有限域交换需要 256 字节以上的公开值。
  • 握手更快。 数字更小,意味着计算更少、数据更少,对手机、路由器和慢速链路有帮助。
  • 设计简洁,不易用错。 X25519 的设计让实现者犯错的机会更少。
  • 形式相同。 每一方生成私有值,推出公开值,交换,再结合得到一个共享秘密。混合颜料的比喻依然适用。

使用 VPN 并不需要掌握曲线运算。知道 ECDH、ECDHE 和 X25519 这些缩写指的是上述在曲线上进行的交换,就够了。

为什么只有交换还不够

到目前为止的故事假设爱丽丝确实在和鲍勃通话。现实中,网络攻击者(我们叫她马洛里)可能坐在中间截获消息。这就是经典的中间人问题,也说明每次密钥交换之上都必须有身份认证。

看看对裸交换的攻击是怎样进行的。

  1. 你把公开值发向服务器,马洛里截获并留下。
  2. 马洛里假装是你,和服务器单独做一次交换;又假装是服务器,和你做另一次交换。
  3. 你和马洛里得到一个共享秘密,服务器和马洛里得到另一个不同的共享秘密。
  4. 你发送的一切,马洛里解密、阅读、重新加密再转发。两端都以为通道是私密的。

数学运作得很完美,只是建立了一条通向错误对象的安全通道。解决办法是让服务器在交换过程中证明自己的身份,方式有几种。

方式 原理 常见用途
证书 服务器出示有签名的证书,并用私钥为握手签名。客户端验证签名链。 网页连接、许多 VPN 配置
已知公钥 客户端提前配置了服务器的公钥,拒绝任何其他公钥。 WireGuard 类对等端
预共享密钥 双方事先持有一个秘密,并证明自己知道它。 站点间链路、部分 IPsec 配置
用户名和密码 在已受保护的隧道内使用,用来识别用户而不是服务器。 许多消费级 VPN 登录

最后一行值得留意。密码登录是向服务器表明你是谁,而服务器的身份是在流程更早阶段用另一种机制认证的。如果想了解证书到底如何证明身份,Let's Encrypt 的“How It Works”页面用几段话讲清了基本思路,我们的 HTTPS 与 VPN 一文则展示了同样的机制在网页浏览中如何出现。

从共享秘密到可用的密钥

原始的共享秘密不会直接当作加密密钥使用。它要经过一个密钥派生函数,这个函数做了几件有用的事。

  • 混入上下文。 函数会吸收对话的细节,比如双方的公开值和握手消息的指纹。如果攻击者改动了其中任何一项,两端会派生出不同的密钥,连接就会失败。
  • 产生多个密钥。 一个共享秘密被扩展成互相独立的密钥:每个传输方向一个,另外还有用于认证消息的。用来发送的密钥绝不会用来接收。
  • 让随机性分布均匀。 曲线计算得到的共享秘密带有结构,派生过程会把它打磨成看上去均匀的密钥材料。
  • 便于更新。 隧道保持连接的同时,可以通过新的交换再派生新的密钥。

此后,加密算法才开始用这个过程产生的密钥处理你的数据包。

真实协议怎么做

不同协议用不同的包装来实现同一个想法。

协议 交换发生在哪里 说明
TLS 1.3 在最初的消息里,客户端发送自己的公开部分,服务器用自己的部分回应 必须使用临时交换;证书为握手签名(RFC 8446)
IKEv2(IPsec) 在交换的第一对消息中,身份尚未透露之前 认证在第二对消息中进行,由第一对产生的密钥保护(RFC 7296)
WireGuard 在一次简短握手里,把对等端的长期公钥与全新的临时密钥结合 设计紧凑,使用固定的一组算法(WireGuard 白皮书)
OpenVPN 通过作为隧道控制通道运行的 TLS 会话 数据通道的密钥来自该 TLS 握手

注意共同的模式:每种设计都会运行临时密钥交换、认证各方、派生密钥,然后才发送数据。细节不同,结构一样。

由于交换最先发生,这一步的任何问题都表现为连接不上,而不是连接变慢。账号密码错误、服务器时钟严重偏差(会破坏证书校验)、或防火墙丢弃最初的几个数据包,都会让交换无法完成。如果你的隧道始终建立不起来,VPN 连接不上怎么办 会按顺序梳理这些原因。

简单谈谈量子问题

上面描述的交换依赖于某些数学难题,而足够大的量子计算机理论上可以解开它们。今天还没有这样的机器,但现在被录下的流量,理论上日后可能被攻击。标准组织已经用新算法作出回应,包括 NIST 标准化的密钥封装机制 ML-KEM(FIPS 203)。许多设计正转向混合交换,把传统的曲线交换与后量子交换结合起来,这样只要其中一半仍然可靠,结果就依然安全。细节以及在服务商宣传中该注意什么,见 后量子 VPN 加密。

你能检查什么,不能检查什么

作为普通用户,你看不到自己的密钥交换,但可以合理判断。

  • 服务商是否说明了密钥交换? 寻找 ECDHE 或 X25519 之类明确的名称,以及服务器如何被认证的说明。
  • 软件是否保持更新? 旧客户端可能包含握手处理方面的已知缺陷。
  • 你信任第一次连接吗? 许多配置依赖于正确设置的服务器身份。请从官方渠道下载应用,避免配置被篡改。
  • 错误信息是否提到证书或认证? 这些指向握手阶段,应当原样报告给客服。

有几个常见误解值得澄清:

  • “密钥交换会隐藏我是谁。” 它保护的是内容。网络观察者可能仍然看得到你连接的是 VPN 服务器。
  • “密钥越长越好。” 超过一定长度后,额外的长度帮助有限。正确的设计与实现更重要。
  • “交换只发生一次。” 长会话期间密钥也会更新,而不只是在开始时。
  • “强大的密钥交换能弥补弱密码。” 密码保护的是你的账号,密钥交换保护的是通道。

想更全面地了解受保护的通道覆盖什么、不覆盖什么,请看 你的运营商能看到你的 VPN 流量吗。

总结

VPN 的密钥交换让你的设备与服务器在公开环境下建立共享秘密:各方保留一个私有数字,交换由它算出的值,数学保证双方能轻松算出秘密,而旁观者在实际中无法做到。现代系统用 X25519 之类的椭圆曲线,让交换快速而紧凑。仅有交换可能被中间人劫持,因此必须通过证书、已知密钥或预共享秘密来认证服务器。结果再经过密钥派生函数,产生互相独立的工作密钥,并在长会话中不断重复这个过程。较新的混合设计正在为量子计算机变得重要的那一天做准备。

如果想在日常使用中亲眼看看,下载页面 有免费应用的链接,价格页面 说明通行证如何运作。

常见问题

所有人都能看到消息,两台设备怎么还能约定一个秘密?

各方保留一个私有数字,并公布由它算出的一个值。借助特殊的数学性质,各方把自己的私有数字与对方的公开值结合,得到相同的结果。只看到公开值的观察者,在实际中无法算出这个结果。

密钥交换就是加密吗?

不是。密钥交换只产生一个共享秘密。这个秘密再被转换成会话密钥,由另一种加密算法用这些密钥来加密你的实际流量。

怎样防止有人在交换过程中冒充 VPN 服务器?

靠身份认证。服务器用证书、预共享密钥或已知的公钥证明自己的身份,客户端进行校验。没有这一步,中间的攻击者可以分别与两端各做一次交换,并转发所有内容。

我需要做什么才能触发密钥交换吗?

不需要。每次隧道启动时它会自动运行,密钥更新时也会再次运行。你只能看到它的效果:连接时短暂等待,或认证失败时出现错误。

常见的密钥交换能抵御量子计算机吗?

目前常用的传统方法,在足够大的量子计算机面前是脆弱的,所以正在引入把它们与新算法结合的混合设计。这样的计算机今天并不存在,但该话题正被积极研究。

关于作者

Bob Kanokphon Thongdee,XPASS VPN 创始人

Bob Kanokphon Thongdee

  • XPASS VPN 创始人
  • eSIMonline.asia 联合创始人
  • 7 年以上网络营销经验
  • Cojourney Visa 与 Cojourney Travel 创始人

短途出行或忙碌的一个月,需要 VPN?

XPASS 提供按天数计算的预付通行证。一次付款,不会自动续费。

查看通行证

继续阅读

VPN 安全

什么是 VPN 加密?

VPN 加密会把你的设备与 VPN 服务器之间的数据打乱。本文讲解密钥、算法和握手如何运作,以及加密做不到什么。

阅读约 10 分钟

VPN 安全

后量子 VPN 加密:对你意味着什么

量子计算常被描述得令人不安。本文解释 VPN 加密中真正存在风险的部分、后量子安全是什么,以及普通用户可以怎么做。

阅读约 9 分钟

VPN 安全

HTTPS 与 VPN 的区别:各自保护什么

HTTPS 保护浏览器与网站之间的连接,VPN 保护设备与 VPN 服务器之间的路径。两者重叠的部分比很多人想象的要少。

阅读约 9 分钟

VPN 基础

什么是 VPN 协议?

VPN 协议规定了你的设备与 VPN 服务器如何连接并保护流量。本文用通俗的语言讲清楚它的含义和主要取舍。

阅读约 9 分钟

隐私指南

开了 VPN,网络运营商还能看到什么?

开启 VPN 后,网络运营商不能再读到你访问的网站,但仍能看到连接本身。本文列出哪些仍然可见、哪些消失了,以及限速与 VPN 的关系。

阅读约 9 分钟