Diffie-Hellman 加密协议介绍 (DH,DHE,ECDHE)

什么是 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不一致怎么办?
共享的秘密值计算完成后,会进一步使用主密钥派生出会话密钥(Session Keys),并用这些会话密钥加密后续的通信数据。如果密钥不一致,后续加解密会出问题,从而检测到问题。

遇到的问题

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

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

使用数字证书
1、客户端和服务器分别生成自己的非对称密钥对,并向 CA 申请数字证书
2、客户端和服务器分别交换各自的数字证书 → 验证彼此证书 → 获取对方公钥
3、标准流程:通常只有服务器对 Diffie-Hellman 公钥进行签名,并将 Diffie-Hellman 公钥及其对应的签名一起发送给客户端,客户端验证签名。这种单向验证足以满足大多数场景的需求。(这里用到了数字签名
特殊情况:在需要相互认证的场景中,双方可以分别对 Diffie-Hellman 公钥进行签名,并互相验证。
4、如果签名验证成功,接收方确认发送方的身份合法。双方继续完成 Diffie-Hellman 密钥交换,协商出共享的秘密值。双方使用协商出的共享秘密值生成会话密钥,用于后续的加密通信。

使用数字签名
1、客户端和服务器分别生成自己的非对称密钥对(公钥和私钥)以及 Diffie-Hellman 公钥
2、发送方使用自己的非对称私钥Diffie-Hellman 公钥进行签名。并将 Diffie-Hellman 公钥及其对应的签名一起发送给接收方。
3、接收方收到 Diffie-Hellman 公钥和签名后,使用发送方的非对称公钥验证签名的有效性。(这里用到了数字证书
4、如果签名验证成功,接收方确认发送方的身份合法。双方继续完成 Diffie-Hellman 密钥交换,协商出共享的秘密值。双方使用协商出的共享秘密值生成会话密钥,用于后续的加密通信。

哪里避免 Diffie-Hellman 中间人攻击?
CA证书保证客户端获取到的服务器的非对称公钥是百分百正确的,非对称公钥+签名保证Diffie-Hellman 公钥是百分百正确的,客户端的Diffie-Hellman 私钥和服务器的Diffie-Hellman 公钥计算得到的百分百正确的共享的秘密值。服务端Diffie-Hellman 私钥只能和正确的客户端Diffie-Hellman 公钥才能算出与之相等的秘密值,如果不相等就说明存在中间人攻击。

数字证书 和 数字签名 都是你中有我,我中有你,不是单独就可以的

预共享密钥(Pre-Shared Key, PSK)
(1) 前置条件
通信双方事先共享了一个预 预共享密钥(Pre-Shared Key, PSK)

(2) 发送方的操作
1、发送方(如服务器)生成自己的 Diffie-Hellman 公钥
2、发送方使用预共享密钥(PSK)Diffie-Hellman 公钥生成一个消息认证码(如 MAC)
3、发送 Diffie-Hellman 公钥 和 MAC

(3) 接收方的操作
1、接收方收到发送方的 Diffie-Hellman 公钥和 MAC 。
2、使用相同的 预共享密钥(Pre-Shared Key, PSK) 对接收到的 Diffie-Hellman 公钥 重新生成消息认证码(MAC)
3、比较接收到的 MAC 和重新生成的 MAC 是否一致。如果一致,则说明 Diffie-Hellman 公钥未被篡改,并且确实由合法的发送方生成。双方协商出共享的秘密值。

哪里避免 Diffie-Hellman 中间人攻击?
如果存在中间人,她无法知道psk,因此无法正确生成mac。当 客户端或 服务端 收到 中间人 发送的消息时,验证会失败,从而检测到攻击。


传统 Diffie-Hellman (BDH)

1、双方预先生成固定的私钥和公钥,并在多次会话中重复使用。
2、双方交换固定的公钥后,计算共享密钥

静态 Diffie-Hellman (SDH)

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

DHE(Diffie-Hellman Ephemeral)

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

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

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)是一种加密通信的安全属性,确保即使长期密钥(如服务器的私钥)在未来被泄露,也无法解密之前已截获的通信内容。换句话说,前向安全性保护了过去的会话免受未来密钥泄露的影响。

DHE 的局限性

(1)计算开销较大
尽管 DHE 的计算效率较高,但相比其他密钥交换算法(如 RSA),它仍然需要更多的计算资源。特别是在处理大量并发连接时,可能会对服务器的性能产生影响。
(2)依赖公共参数的安全性
DHE 的安全性依赖于公共参数的选择(如大素数 ( p ) 和生成元 ( g ))。如果这些参数选择不当,可能会导致安全性降低。
(3)需要额外的身份验证机制
DHE 本身只负责密钥交换,无法验证通信双方的身份。因此,通常需要结合数字证书或其他身份验证机制来确保通信的安全性。


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 提供高效的密钥交换前向安全性

### 解决方案概述 为了增强服务器 SSL/TLS 中的瞬时 Diffie-Hellman 公共密钥强度,确保其不低于 2048 位是必要的措施之一。这可以通过调整服务器配置来实现,具体方法取决于所使用的服务器软件。 对于 Spring Boot 项目中的 Tomcat 或其他应用服务器,可以在 `application.yml` 文件中指定更强的安全参数[^5]。而对于 Nginx 和 Apache 这样的 Web 服务器,则需修改相应的配置文件并更新 OpenSSL 版本以支持更强大的加密算法[^4]。 ### 配置实例 #### 修改 Spring Boot 的 application.yml 文件 在 Spring Boot 应用程序中,通过编辑 `application.yml` 来设置启用的协议版本以及密码套件列表: ```yaml server: port: 8443 ssl: key-store: classpath:keystore.p12 key-store-password: secret keyStoreType: PKCS12 keyAlias: tomcat enabled-protocols: TLSv1.2,TLSv1.3 ciphers: | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 ``` 上述配置不仅限定了更高的 DH 参数长度,还选择了更为现代且安全的密码组合方式。 #### 更新 Nginx 配置 如果使用的是 Nginx 作为反向代理或者负载均衡器,在 nginx.conf 中加入如下指令可提高安全性: ```nginx ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparams.pem; # 自定义生成的大于等于2048 bit的DH参数文件路径 ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 加强型密码策略 ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ``` 这里特别指出了要加载自定义生成的一个大于等于 2048-bit 的 DH 参数文件 (`/etc/nginx/dhparams.pem`),从而有效防止因默认较低级别的 DH 密钥带来的安全隐患。 #### 使用命令行工具生成大尺寸 DH 参数 可以利用 OpenSSL 工具创建一个新的、足够强壮的 DH 参数集用于部署到生产环境之前测试用途: ```bash openssl dhparam -out dhparams.pem 2048 ``` 此操作会花费一些时间完成计算过程,但最终产生的 `.pem` 文件即为所需的高强度 DH 参数集合。 ### 结论 通过对服务器端进行适当配置更改,并采用最新的加密技术和实践标准,能够显著提升 SSL/TLS 握手过程中临时 Diffie-Hellman 密钥交换环节的安全水平,进而满足严格的信息安全保障需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值