首页/安全/加密与证书速查/Diffie-Hellman 密钥交换
加密算法基础95 条

Diffie-Hellman 密钥交换

最早的公开密钥协商方案:双方在公开信道上交换幂值,各自计算出相同的共享秘密;TLS 中配合标准参数组(RFC 7919)使用。

加密与证书速查安全更新于 2026-10-13

Diffie-Hellman 是什么

DH 是最早公开的密钥协商方案:双方各自生成一个私钥指数,在公开信道上交换对应的幂值,再各自用对方的幂值算出相同的共享秘密。窃听者只能看到交换的幂值,要还原共享秘密需要求解离散对数。TLS、SSH、IPsec 都用它协商会话密钥,现代部署通常配合 RFC 7919 定义的标准参数组使用。

基本信息

原理交换 g^a mod p 与 g^b mod p,双方各自算出 g^(ab) mod p
参数组ffdhe2048/3072/4096(RFC 7919)、MODP 组(RFC 3526)
强度2048 位约对应 112 位安全强度
身份认证本身不认证对方,必须结合证书签名或预共享密钥
前向保密每次连接生成新的私钥指数即可获得
参数来源优先使用标准组,避免自生成

典型使用场景

  • 加固 TLS 配置:把最小群强度提到 2048 位以上
  • 排查 VPN 与 SSH 的协商强度:确认实际使用的群是否达标
  • 合规审计取证:提供实际协商参数组与强度的证据
  • 内网设备兼容性评估:判断只支持弱群的设备能否替换或隔离
  • 理解密钥协商过程:用最小示例观察双方算出同一共享秘密

生成与查看 DH 参数

生成与查看 DH 参数
# 生成 2048 位参数(自建参数场景,注意生成耗时较长)
openssl genpkey -genparam -algorithm DH -pkeyopt dh_paramgen_prime_len:2048 -out dhparam.pem
# 查看参数头部信息,确认位数是否符合预期
openssl dhparam -in dhparam.pem -noout -text | Select-Object -First 5
# 观察服务端实际使用的临时密钥与协商组
openssl s_client -connect example.com:443 -servername example.com </dev/null | Select-String 'Server Temp Key'

DH 与 ECDHE 对照

维度DH(有限域)ECDHE
报文体积较大明显更小
计算开销较高较低
常见参数组ffdhe2048/3072/4096X25519、P-256
当前地位兼容与合规场景常见TLS 主流默认
自生成 DH 参数存在质量风险;现代部署优先直接使用 RFC 7919 标准组,避免共享弱素数带来的预计算风险。
前向保密来自临时性:每次连接生成新的私钥指数,那么即使长期私钥日后泄露,历史会话密钥也无法被还原。静态 DH(双方用固定密钥对)不具备这一性质。
身份问题是 DH 之外的命题:它只负责协商密钥,双方身份必须由证书签名或预共享密钥确认,否则中间人可以在两条连接上各做一次 DH 而双方毫无察觉。

易错点

  • DH 本身不认证对方身份,必须与证书签名或 PSK 结合,否则易被中间人替换
  • 参数长度低于 2048 位(尤其 1024 位)与常见公开组相同者,存在预计算类风险
  • 自生成参数若质量不足,实际强度低于标称位数
  • 使用静态密钥对而非临时密钥,会失去前向保密能力
  • 双方参数不一致时协商直接失败,混用标准组与自建参数前要确认对端能力

数据来源与参考

  • RFC 7919(协商式 FFDHE 组)
  • RFC 3526(MODP 组)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌