Diffie-Hellman 加密协议介绍 (DH,DHE,ECDHE)
Diffie-Hellman 协议是由 Whitfield Diffie 和 Martin Hellman 在 1976 年提出的一种非对称加密协议。
目录
🔍什么是 Diffie-Hellman 【/ˈdɪ.fi ˈhɛl.mən/】
由 Whitfield Diffie 和 Martin Hellman 在 1976 年提出的一种非对称加密协议,主要用于密钥交换。
✅DH 的工作流程
假设 小博 和 小民 想要通过不安全的网络协商出一个共享的秘密值,具体步骤如下:
(1)双方约定公共参数(公开可见,无需保密)
双方事先约定两个公开参数,这些参数可以公开传输,不会影响安全性。
🌟一个大素数 p(作为模数)。
🌟一个底数 g(满足 1 < g < p)。
(2)生成私钥(仅自己持有,绝对保密) 和 计算公钥
小博:随机选择一个私钥 a(1 < a < p-1),根据公式计算自己的公钥:A = g^a mod p
小民:随机选择一个私钥 b(1 < 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)。
❗️因为p,g为公开参数,无法确定收到 A 和 B 就是小博 和 小民 的公钥 A 和 B 。坏人就可以夹在 小博和小民中间,充当中间人,进行冒充了(小博 ↔ 坏人↔ 小民)。
✅如何避免 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)
✅双方生成固定的私钥和公钥,并在多次会话中重复使用。
✅SDH和BDH没有本质区别,两者是同一种机制的不同称呼。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) 完成握手
客户端发送 ChangeCipherSpec 和 Finished 消息,表示切换到加密模式。
服务器同样发送 ChangeCipherSpec 和 Finished 消息。
握手完成,双方开始使用会话密钥进行加密通信。
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、移动支付、物联网) |
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)