【路由器-AP、DHCP、ARP、广播帧、交换机、信道】-初级知识串联(三)之EAPOL四次握手
目录企业版(Enterprise)和个人版(Personal)的区别1 EAPOL是什么1). 用于身份认证的 EAPOL(传统认知)2). 用于密钥协商的 EAPOL2.WPA2-Personal (PSK) EAPOL四次握手详解四次握手完整过程第0步:前提条件第1步:信息宣告(M1)第2步:能力证明(M2)第3步:密钥安装与组播密钥下发(M3)第4步:最终确认(M4)安全意义分析PTK(Pa
目录
企业版(Enterprise)和个人版(Personal)的区别
2.WPA2-Personal (PSK) EAPOL四次握手详解
2.1)KCK(Key Confirmation Key,密钥确认密钥)
企业版(Enterprise)和个人版(Personal)的区别
| 方面 | WPA2-Personal (PSK) | WPA2-Enterprise (802.1X) |
|---|---|---|
| 密码/凭证 | 预共享密钥(所有人相同) | 个人用户名/密码或证书 |
| PMK来源 | PBKDF2(密码, SSID) | EAP认证生成(每次不同) |
| 认证位置 | 本地(AP内部) | 远程(RADIUS服务器) |
| 适用场景 | 家庭、小店 | 企业、学校 |
| 安全性 | 中(密码泄露影响所有人) | 高(个人凭证独立) |
这确实是很多人容易混淆的地方,因为它也叫"四次握手",但与企业版(802.1X)完全不同!本节和大家分享WPA2-Personal (PSK)四次握手协议
1 EAPOL是什么
在 WPA/WPA2-Personal 中,我们看到的 M1-M4(四次握手)报文也被标识为EAPOL。这与我们通常理解的EAPOL用于“用户身份认证”似乎有矛盾。现在让我们重新组织并精确定义EAPOL,以涵盖您遇到的情况。
EAPOL的重新定义与核心本质
EAPOL 的本质是:一个在局域网二层(数据链路层)上承载“认证与密钥管理协议”的通用传输框架。
它最初是为承载 EAP 协议而生,但设计是可扩展的。这个“扩展”不仅指EAP内部的方法,更关键的是,EAPOL的“载荷”部分可以承载多种类型的“密钥管理”协议数据。
这导致了EAPOL的两个主要且平行的用途:
1). 用于身份认证的 EAPOL(传统认知)
这是EAPOL的“本职工作”。它承载 EAP 协议报文,用于在客户端和网络设备之间传递用户名、密码、证书等身份信息。
-
应用场景: 802.1X / WPA/WPA3-Enterprise。
-
数据包类型:主要是
EAPOL-Packet(封装EAP消息)和EAPOL-Start/Logoff等。 -
目的: 验证“你是谁”。
2). 用于密钥协商的 EAPOL
这是EAPOL框架的扩展应用。它承载 密钥管理协议报文,用于在身份验证(或共享密钥确认)完成后,协商出用于加密实际数据的动态会话密钥。
-
应用场景: WPA/WPA2/WPA3-Personal 的四次握手,以及Enterprise模式中认证完成后的密钥派生过程。
-
数据包类型:主要是
EAPOL-Key。 -
目的: 协商“我们用什么密钥通信”。
2.WPA2-Personal (PSK) EAPOL四次握手详解
四次握手完整过程

第0步:前提条件
双方必须预先配置相同的PSK(预共享密钥,连接wifi时需要的输入的密码)。在连接前,双方都会通过PBKDF2算法,将PSK + SSID + 4096次迭代计算出PMK:
PMK = PBKDF2(PSK, SSID, 4096, 256)
PMK是四次握手的基础,但PMK本身不会直接用于加密数据。
第1步:信息宣告(M1)
接入点 → 客户端:发送 EAPOL-Key 帧(M1)
-
包含:一个随机数 ANonce(Authenticator Nonce)
-
目的:
-
宣告开始四次握手
-
向客户端提供生成PTK所需的第一个随机数
-
-
此时:AP尚未验证客户端是否拥有正确的PMK
第2步:能力证明(M2)
客户端 → 接入点:发送 EAPOL-Key 帧(M2)
-
包含:
-
客户端生成的随机数 SNonce(Supplicant Nonce)
-
MIC(Message Integrity Code,消息完整性校验码)
-
客户端的RSN IE(安全能力信息)
-
-
关键过程:
-
客户端收到ANonce后,结合自己已知的PMK、SNonce、以及双方MAC地址,使用PRF函数计算出PTK:
PTK = PRF(PMK, "Pairwise key expansion", Min(AA,SA) || Max(AA,SA) || Min(ANonce, SNonce) || Max(ANonce, SNonce)) -
PTK被分为多个部分:KCK(用于计算MIC)、KEK(用于加密后续密钥)、TK(用于加密数据)
-
客户端使用KCK对M2报文(除MIC字段外)计算MIC,并将MIC填入报文
-
-
目的:
-
提供第二个随机数(SNonce)
-
首次证明“我拥有正确的PMK”(因为只有拥有正确PMK才能计算出正确的MIC)
-
第3步:密钥安装与组播密钥下发(M3)
接入点 → 客户端:发送 EAPOL-Key 帧(M3)
-
包含:
-
再次发送ANonce(或标识)
-
MIC(使用AP计算出的KCK)
-
加密的GTK(Group Temporal Key,组临时密钥)
-
安装指示标志
-
-
关键过程:
-
AP收到M2后,使用SNonce和存储的PMK以相同方式计算出PTK
-
AP使用自己计算出的KCK验证M2中的MIC
-
验证成功:证明客户端确实拥有正确的PMK
-
验证失败:握手终止,连接拒绝
-
-
AP使用KEK加密GTK,并将加密后的GTK放入M3
-
AP计算M3的MIC,并安装TK(开始使用TK加密单播数据)
-
-
目的:
-
确认客户端的PMK有效
-
下发用于解密组播/广播数据的GTK
-
指示客户端安装密钥
-
第4步:最终确认(M4)
客户端 → 接入点:发送 EAPOL-Key 帧(M4)
-
包含:
-
MIC
-
确认安装标志
-
-
关键过程:
-
客户端使用KEK解密GTK并存储
-
客户端验证M3的MIC
-
客户端安装TK和GTK(开始使用TK加密数据)
-
发送M4作为最终确认
-
-
目的:
-
确认GTK接收成功
-
确认密钥已安装
-
握手完成
-
安全意义分析
-
双向认证:M2证明了客户端有PMK,M3证明了AP有PMK
-
密钥新鲜性:每次握手使用新的随机数(Nonce),确保每次会话的PTK都不同
-
前向安全性:即使PSK泄露,过去的会话记录也无法解密(因为每次PTK不同)
-
抵抗重放攻击:通过Nonce和报文序号实现
PTK(Pairwise Transient Key)详解
1). PTK是什么?
PTK是每次连接临时生成的会话密钥,用于实际的数据加密和完整性保护。它由512位(64字节)组成,分解为三个主要部分:
完整PTK (512位 = 64字节)
├── 字节0-15: KCK (Key Confirmation Key) 128位
├── 字节16-31: KEK (Key Encryption Key) 128位
├── 字节32-47: TK (Temporal Key) 128位
└── 字节48-63: 保留(可能用于后续扩展) 128位
2). 各个部分的作用详解
2.1)KCK(Key Confirmation Key,密钥确认密钥)
-
长度:128位(16字节)
-
作用:计算和验证MIC(消息完整性校验码)
-
使用场景:在M2消息中:客户端用KCK计算MIC,证明自己拥有正确的PMK
# MIC计算示例
def calculate_mic(kck, message_data):
"""
使用KCK计算消息的MIC
"""
import hmac
# HMAC-SHA1-128 (SHA1输出160位,取前128位)
mic_full = hmac.new(kck, message_data, 'sha1').digest()
mic = mic_full[:16] # 取前16字节(128位)作为MIC
return mic
# 验证示例
def verify_mic(kck, message_data, received_mic):
calculated_mic = calculate_mic(kck, message_data)
return calculated_mic == received_mic
2.2) MIC计算原理
MIC的数学表达式:
MIC = HMAC-SHA1(KCK, M)[0:16]
其中:
- KCK: Key Confirmation Key (128位)
- M: 要计算MIC的消息数据(包括EAPOL头部和Key Data)
- [0:16]: 取HMAC-SHA1输出的前128位
HMAC-SHA1函数定义:
HMAC-SHA1(K, text) = SHA1( (K ⊕ opad) || SHA1( (K ⊕ ipad) || text ) )
其中opad = 0x5C重复,ipad = 0x36重复
2.3)MIC计算的完整过程
阶段一:M2中的MIC计算(客户端→AP)
计算表达式:
M2_MIC = HMAC-SHA1(KCK, M2_Data)[0:16]
M2_Data =
EAPOL_Version(1) || EAPOL_Type(3) || EAPOL_Length ||
EAPOL_Key_Descriptor_Type(2) ||
EAPOL_Key_Info || EAPOL_Key_Length ||
EAPOL_Key_Replay_Counter ||
EAPOL_Key_Nonce(Snonce) ||
EAPOL_Key_IV(全0) ||
EAPOL_Key_RSC(全0) ||
EAPOL_Key_MIC(全0占位) ||
EAPOL_Key_Data_Length ||
EAPOL_Key_Data(RSN_IE)
阶段二:M3中的MIC计算(AP→客户端)
M3_MIC = HMAC-SHA1(KCK, M3_Data)[0:16]
M3_Data =
EAPOL_Version(1) || EAPOL_Type(3) || EAPOL_Length ||
EAPOL_Key_Descriptor_Type(2) ||
EAPOL_Key_Info || EAPOL_Key_Length ||
EAPOL_Key_Replay_Counter ||
EAPOL_Key_Nonce(Anonce) ||
EAPOL_Key_IV(全0) ||
EAPOL_Key_RSC(全0) ||
EAPOL_Key_MIC(全0占位) ||
EAPOL_Key_Data_Length ||
EAPOL_Key_Data(加密的GTK_KDE)
M3与M2的关键区别:
-
Key Info字段不同:M3包含Install标志(表示安装密钥)
-
Key Data内容不同:M3包含加密的GTK
-
Nonce不同:M3使用与M1相同的Anonce
更多推荐

所有评论(0)