术语表

Diffie-Hellman (DH 密钥交换,临时版本称 DHE)

最后核实

定义

Diffie-Hellman 是 1976 年提出的密钥协商方法,让通信双方在公开信道上各自算出相同的共享秘密,而无需传输这个秘密本身。

Diffie-Hellman 由 Whitfield Diffie 和 Martin Hellman 于 1976 年发表。经典的有限域形式中,双方共享公开的素数 p 和生成元 g;各自选一个私有数,发送 g 的该次幂模 p 的结果,再把收到的值用自己的私有数做幂运算,最终得到相同的结果。窃听者要想算出它,就得解离散对数问题。ECDHE 是同一思路在椭圆曲线群上的版本。

为什么重要

每次连接都用新密钥的 Diffie-Hellman(DHE 或 ECDHE)是 TLS 实现前向保密的基础。但它本身不认证身份:中间人可以分别和两端各做一次交换。TLS 的做法是让服务器用证书私钥对 DH 参数签名。群的大小同样关键:2015 年的 Logjam 攻击表明,512 位出口级 DH 很快就能被破解,被大量服务器共用的 1024 位群也在资源充足的攻击者能力范围之内。

例子

用很小的数字演示一次交换(实际使用 2048 位以上的素数或椭圆曲线):

Public:  p = 23, g = 5
Alice:   a = 4   ->  A = 5^4 mod 23 = 4
Bob:     b = 3   ->  B = 5^3 mod 23 = 10
Alice:   B^a mod 23 = 10^4 mod 23 = 18
Bob:     A^b mod 23 = 4^3  mod 23 = 18   (shared secret)

双方都得到 18,而线路上只出现过 23、5、4、10 这几个公开值。

常见误区

  • Diffie-Hellman 负责加密数据。 它只产生共享秘密,真正加密流量的是由此派生密钥的对称算法,比如 AES-GCM。
  • 有了 DH 就不怕中间人。 未经认证的 DH 可以被中间人劫持,身份认证要靠证书和签名。
  • 自定义的超大 DH 群一定更好。 标准的 2048 位群已被认为安全,更大的群会拖慢每次握手,而且现在多数服务器优先使用 ECDHE。

延伸阅读