🔍什么是 Diffie-Hellman 【/ˈdɪ.fi ˈhɛl.mən/】

由 Whitfield Diffie 和 Martin Hellman 在 1976 年提出的一种非对称加密协议,主要用于密钥交换。

✅DH 的工作流程

假设 小博 和 小民 想要通过不安全的网络协商出一个共享的秘密值,具体步骤如下:

(1)双方约定公共参数(公开可见,无需保密)

双方事先约定两个公开参数,这些参数可以公开传输,不会影响安全性。
🌟一个大素数 p(作为模数)。
🌟一个底数 g(满足 1 < g < p)。

(2)生成私钥(仅自己持有,绝对保密) 和 计算公钥

小博:随机选择一个私钥 a1 < a < p-1),根据公式计算自己的公钥:A = g^a mod p
小民:随机选择一个私钥 b1 < b < p-1),根据公式计算自己的公钥:B = g^b mod p

(3)交换公钥(公开传输,可被监听)

小博 将自己的公钥 A 发送给 小民。
小民 将自己的公钥 B 发送给 小博。
公钥可以在不安全的信道中传输,因为它们本身并不直接暴露秘密值。

(4)双方计算 “共享密钥”(结果完全一致,且仅双方知晓)

小博:使用自己的私钥 a 和 小民 的公钥 B 计算共享密钥:Shared Secret = B^a mod p = (g^b mod p)^a mod p = (g^b)^a mod p
小民:使用自己的私钥 b 和 小博 的公钥 A 计算共享密钥:Shared Secret = A^b mod p = (g^a mod p)^b mod p = (g^a)^b mod p
由于模幂运算的性质(g^b)^a mod p = (g^a)^b mod p,所以 小博 和 小民 计算出的共享秘密值是相同的:

🔍 如果计算的Shared Secret不一致怎么办?
⭐️共享密钥(Shared Secret)不一致 ➡ 派生的会话密钥(Session Keys)必然不同 ➡ 双方用各自的会话密钥加解密数据时,会出现 “解密后乱码”“解密失败报错” 等现象,从而明确检测到问题。
⭐️除了 “后续加解密失败” 这个 “被动检测” 方式,主流协议(如 TLS、IPsec)在 DH 密钥协商后,还会增加 “主动验证步骤”,更早发现共享密钥不一致,避免无效通信。

(5)生成会话密钥

双方使用共享秘密值 ( Shared Secret ) 生成会话密钥(Session Key)。会话密钥用于后续的加密通信。


⚠️DH 遇到的问题

❗️虽然 DH协议 能够安全地协商出共享的秘密值,但它本身并不提供身份验证机制。如果通信双方无法确认对方的身份,就可能遭受中间人攻击(Man-in-the-Middle Attack, MITM)。
❗️因为pg为公开参数,无法确定收到 AB 就是小博 和 小民 的公钥 AB 。坏人就可以夹在 小博和小民中间,充当中间人,进行冒充了(小博 ↔ 坏人↔ 小民)。


如何避免 Diffie-Hellman 中间人攻击?

🔰 最主流方案:用数字证书验证公钥归属(🛡️TLS/SSL 协议标配)

中间人攻击的关键漏洞是 “DH 公钥交换时,攻击者可伪造双方公钥并分别发给对方”,而数字证书能通过权威第三方(CA)背书,证明 “公钥确实属于声称的用户”。这是目前最通用的方案,广泛用于 HTTPS、VPN 等场景(如 TLS 1.2/1.3 协议中,DH/ECDHE 密钥协商必搭配证书验证)。

🔰 预共享密钥(PSK)方案:提前约定共享密钥验证身份

若通信双方在安全环境下(如线下、已加密通道)提前约定了一个预共享密钥(PSK),可通过该密钥验证公钥的真实性,无需依赖 CA,具体逻辑如下:

🔢A 和 B 在通信前,通过安全方式(如 U 盘拷贝、线下口头告知)约定一个唯一的 PSK(如 “a8f2d3x9…”),仅双方知晓。
🔢A 生成 DH 公钥后,用 PSK 对 “公钥 + 随机数” 计算哈希值,将 “公钥 + 哈希值” 发给 B;
🔢B 收到后,先用相同的 PSK 计算 “收到的公钥 + 随机数” 的哈希值,与 A 发送的哈希值对比:
若一致,证明公钥确实来自 A(攻击者不知 PSK,无法生成正确哈希值);
若不一致,说明公钥被篡改,终止通信。
🔢B 同理向 A 发送 “公钥 + PSK 哈希值”,A 完成验证。

该方案适合封闭场景(如企业内部设备通信、物联网终端),无需 CA 管理,但缺点是 PSK 需提前安全分发,不适合大规模陌生设备通信。

🔰 短认证字符串(SAS)验证:人工确认公钥指纹

🔢A 和 B 各自生成 DH 公钥后,对 “公钥” 计算短哈希值(即 “指纹”),通常转换为易读的短字符串(如 6-8 位字母 / 数字组合,或 “词汇短语”,如 Signal 的 “紫狗 - 绿树 - 蓝车”)。
🔢A 和 B 通过线下方式(如面对面、电话)核对对方的公钥指纹:
若双方报出的指纹完全一致,证明公钥未被中间人篡改;
若不一致,说明存在中间人攻击,需重新建立通信链路。

该方案依赖人工操作,安全性完全取决于 “核对过程是否被监听”,适合小范围、对安全性要求较高且无 CA 的场景,但不适合自动化通信(如服务器间通信)。


⚠️DH 局限性

⭐️(1)计算开销较大
⭐️(2)依赖公共参数的安全性
⭐️(3)需要额外的身份验证机制


📌传统 Diffie-Hellman (BDH) / 静态 Diffie-Hellman (SDH)

✅双方生成固定的私钥和公钥,并在多次会话中重复使用。

SDHBDH没有本质区别,两者是同一种机制的不同称呼。BDH更常用于学术或理论描述中。SDH更常用于实际应用或工业标准中。


DHE(Diffie-Hellman Ephemeral)

Diffie-Hellman Ephemeral(简称 DHE)是一种基于 Diffie-Hellman 协议的密钥交换机制,其核心特点是使用临时密钥(Ephemeral Keys),即每次会话生成新的私钥和公钥。

双方交换各自的临时公钥。使用自己的私钥和对方的公钥计算共享密钥。会话结束后,临时密钥会被丢弃,不会保存在任何地方。

DHE 工作流程

(1)初始化连接
双方(如客户端和服务器)通过某种方式(如 TLS 握手)建立连接。双方约定一组公共参数(如大素数 ( p ) 和底数 ( g ))。
(2)生成临时密钥对
服务器端:生成一个随机的私钥 ( x ),计算对应的公钥 ( X = g^x mod p )。
客户端:生成一个随机的私钥 ( y ),计算对应的公钥 ( Y = g^y mod p )。
(3)交换公钥
服务器将生成的公钥 ( X ) 发送给客户端。
客户端将生成的公钥 ( Y ) 发送给服务器。
(4)计算共享秘密值
服务器端:使用客户端的公钥 ( Y ) 和自己的私钥 ( x ),计算共享秘密值 ( S = Y^x mod p )。
客户端:使用服务器的公钥 ( X ) 和自己的私钥 ( y ),计算共享秘密值 ( S = X^y mod p )。
由于数学性质,( S = (g^y)^x mod p = (g^x)^y mod p ),因此双方计算出的共享秘密值相同。
(5)生成会话密钥
双方使用共享秘密值 ( S ) 生成会话密钥(Session Key)。会话密钥用于后续的加密通信。
(6)销毁临时密钥对
临时密钥对(私钥 ( x ) 和 ( y ))在会话结束后被销毁,无法再次使用。

DHE 优势

(1)前向安全性(Forward Secrecy)

前向安全性(Forward Secrecy) 啥意思?
前向安全性(Forward Secrecy,简称 FS)是一种加密通信的安全属性,确保即使长期密钥(如服务器的私钥)在未来被泄露,也无法解密之前已截获的通信内容。换句话说,前向安全性保护了过去的会话免受未来密钥泄露的影响。


ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)

ECDHE 是一种基于椭圆曲线密码学(Elliptic Curve Cryptography, ECC)的 Diffie-Hellman 密钥交换协议,结合了临时密钥(Ephemeral Keys)的概念。

椭圆曲线密码学(ECC)
椭圆曲线密码学是一种非对称加密技术,基于椭圆曲线上的点运算代替传统的模幂运算,显著提高了计算效率。它提供与传统 RSA 或 DH 相同的安全性,但使用更短的密钥长度,从而提高计算效率和性能。

临时密钥对(Ephemeral Keys)
每次通信时生成独立的临时密钥对,仅用于当前会话。临时密钥对在会话结束后被销毁,无法再次使用。
这就保证了前向安全性(Forward Secrecy),即使长期密钥泄露,也无法解密之前的会话。


ECDHE结合数字证书的工作流程

ECDHE 结合数字证书 的工作原理与 SSL/TLS 协议的核心步骤高度一致,因为 ECDHE 是 SSL/TLS 中常用的密钥交换算法之一。

(1) 初始化连接
客户端向服务器发送 ClientHello 消息,表示希望建立安全连接,并提供支持的加密套件列表。
服务器响应 ServerHello 消息,选择一个加密套件(如 ECDHE),并附带自己的数字证书。

(2) 验证服务器身份
参考 如何使用数字证书验证服务器身份 ,客户端提取服务器的公钥(用于后续的签名验证)。

(3) 生成临时椭圆曲线密钥对
服务器和客户端分别生成临时的椭圆曲线密钥对(公钥和私钥)。
服务器:随机选择一个私钥 (d_A),计算对应的公钥 (Q_A)
客户端:随机选择一个私钥 (d_B),计算对应的公钥 (Q_B)。

在椭圆曲线密码学(ECC)中,d_A 和 Q_A 是两个重要的概念,分别表示私钥和公钥。它们的命名方式来源于数学符号和密码学的传统约定。
d:代表“discrete”或“domain”,表示离散域中的一个随机数。
Q:代表“Point”,表示椭圆曲线上的一个点。
A:表示该私钥属于用户 A。

(4) 交换椭圆曲线公钥
服务器将生成的公钥 (Q_A) 发送给客户端。(服务器将公钥 (Q_A) 包含在 ServerKeyExchange 消息中发送给客户端,并用服务器的私钥对消息进行签名(确保消息完整性))
客户端将生成的公钥 (Q_B) 发送给服务器。

(5) 验证椭圆曲线公钥
客户端收到公钥 (Q_A)及其签名后,使用服务器数字证书中的公钥验证 ServerKeyExchange 消息的签名,确保消息未被篡改。

(6) 协商共享秘密值
双方使用各自的临时椭圆曲线私钥对方的椭圆曲线公钥,计算出相同的共享秘密值

(7) 生成会话密钥
双方使用协商出的共享秘密值,结合其他参数(如随机数、哈希函数等),生成最终的会话密钥。用于后续的加密通信。

(8) 完成握手
客户端发送 ChangeCipherSpecFinished 消息,表示切换到加密模式。
服务器同样发送 ChangeCipherSpecFinished 消息。
握手完成,双方开始使用会话密钥进行加密通信。

ECDHE 的特点
使用临时密钥对(Ephemeral Keys),确保每次会话的独立性。因此保证前向安全性(Forward Secrecy),即使长期密钥泄露,也无法解密之前的会话。

结合的优势
ECDHE 提供高效的密钥交换前向安全性

SDH 🆚 DHE 🆚 ECDHE

对比维度 Static DH(静态 DH) DHE(Diffie-Hellman Ephemeral) ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)
核心定义 私钥长期固定的 DH 算法,参数复用 临时私钥的 DH 改进版,每次通信生成新密钥对 结合椭圆曲线的临时密钥交换,高效且安全
数学基础 大整数离散对数问题 大整数离散对数问题 椭圆曲线离散对数问题(ECC)
引入年限 1976 年(与 DH 算法同期提出,为 DH 的原始实现方式) 1992 年(由 Hugo Krawczyk 等人提出 “临时化” 概念,后被 IETF 标准化) 2006 年(随椭圆曲线加密普及,被 TLS 1.2 纳入标准)
密钥生成特性 私钥固定(长期使用),参数(p、g)常复用 每次通信临时生成私钥,用完即弃 每次通信临时生成私钥,基于椭圆曲线,密钥长度更短
前向安全性 无(私钥泄露可解密所有历史通信) 有(临时私钥仅用一次,泄露不影响历史数据) 有(临时密钥 + ECC 高安全性,前向安全更可靠)
计算效率 低(大整数模幂运算耗时) 低(与 Static DH 计算逻辑相同,仅私钥生成方式不同) 高(同等安全强度下,密钥长度短,运算速度快 100-1000 倍)
安全风险 1. 无身份验证,易遭中间人攻击
2. 固定私钥泄露风险高
3. 易受 Logjam 攻击
1. 需搭配证书 / PSK 防中间人攻击
2. 大整数参数需足够长(≥2048 位)
1. 需搭配证书 / PSK 防中间人攻击
2. 避免弱曲线(如 secp112r1)
典型应用场景 早期封闭系统(如旧版 VPN),现基本淘汰 对前向安全有要求、算力充足的场景(如部分企业内网) 现代主流场景(HTTPS/TLS 1.3、移动支付、物联网)
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐