首页/网络/协议速查/Diffie-Hellman 密钥交换与参数

Diffie-Hellman 密钥交换与参数

双方在不安全信道各自计算共享密钥的经典算法:临时 DH(DHE/ECDHE)提供前向保密,弱参数会被 Logjam 类攻击。

协议速查网络更新于 2026-10-13

DH 解决了什么

Diffie-Hellman 让双方在不安全信道中各自算出一个相同的共享密钥,旁观者即使录下全部交换的数据也算不出来。它本身不验证对方是谁——身份由证书与签名负责,两件事配合才是完整的密钥交换。

临时与静态的区别

只有临时密钥(DHE、ECDHE,每次会话重新生成)才提供前向保密:即使服务器的长期私钥日后泄露,攻击者也解不开此前录下的流量。ECDHE 参数更短更快,是现代默认选择;有限域 DHE 需要足够大的素数(2048 位以上),弱参数会带来 Logjam 类风险(RFC 7919)。

基本信息

DHE有限域 DH,参数为素数模数,要求 2048 位以上
ECDHE椭圆曲线 DH,更快更短,现代首选
前向保密只有每次会话新建密钥对的临时方式才具备
规范RFC 7919 定义了标准化的有限域参数组

典型使用场景

  • 检查服务端是否提供前向保密
  • 兼容老客户端时判断是否还需保留有限域 DHE 套件
  • 排查从网上抄来的弱参数隐患
  • 对照合规基线提出密钥交换要求

检查与生成参数

检查与生成参数
openssl s_client -connect example.com:443 -cipher 'DHE-RSA-AES128-GCM-SHA256' </dev/null 2>/dev/null | grep -i 'server temp key'
openssl s_client -connect example.com:443 </dev/null 2>/dev/null | grep -i 'server temp key'   # 默认协商的密钥类型与强度
openssl dhparam -out dh2048.pem 2048     # 仅在需要兼容有限域 DHE 时生成,耗时较久

三种密钥交换

方式是否前向保密说明
ECDHE是现代默认,性能与安全性兼顾
DHE是需 2048 位以上参数,性能较差
静态密钥交换否长期私钥一旦泄露,历史流量可被解密
使用 ECDHE 时无需另外手工生成 dhparam;只有为了兼容老客户端保留有限域 DHE 套件才需要生成。
直接复制网络上的 1024 位 dhparam 是历史事故的源头。要么只用 ECDHE,要么使用 RFC 7919 定义的标准参数组。
换用 ECDHE 之后,dhparam 文件不再影响新的握手,但保留旧文件并不会带来风险;真正需要清理的是仍然启用弱参数的那部分套件配置。

易错点

  • 复制网上的 1024 位 DH 参数:共享密钥可能被降级攻击解出,等于没有加密
  • 把静态 DH 当成具备前向保密:密钥复用使历史流量在私钥泄露后可被解密
  • 生成超大 dhparam 后手工放行:握手明显变慢,收益却接近于零,应优先使用 ECDHE
  • 禁用 ECDHE 只保留有限域 DHE:性能更差且参数维护成本更高
  • 只看套件名称不看实际协商结果:同一套件在不同客户端上可能走不同的密钥交换

数据来源与参考

  • RFC 7919(FFDHE 参数)
  • RFC 2631

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌