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