目录

企业版(Enterprise)和个人版(Personal)的区别

1 EAPOL是什么

1). 用于身份认证的 EAPOL(传统认知)

2). 用于密钥协商的 EAPOL

2.WPA2-Personal (PSK) EAPOL四次握手详解

四次握手完整过程

第0步:前提条件

第1步:信息宣告(M1)

第2步:能力证明(M2)

第3步:密钥安装与组播密钥下发(M3)

第4步:最终确认(M4)

安全意义分析

PTK(Pairwise Transient Key)详解

1). PTK是什么?

2). 各个部分的作用详解

2.1)KCK(Key Confirmation Key,密钥确认密钥)

2.2) MIC计算原理

2.3)MIC计算的完整过程

阶段一:M2中的MIC计算(客户端→AP)

计算表达式:

阶段二:M3中的MIC计算(AP→客户端)

M3与M2的关键区别:


企业版(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)

  • 目的

    1. 宣告开始四次握手

    2. 向客户端提供生成PTK所需的第一个随机数

  • 此时:AP尚未验证客户端是否拥有正确的PMK

第2步:能力证明(M2)

客户端 → 接入点:发送 EAPOL-Key 帧(M2)

  • 包含

    1. 客户端生成的随机数 SNonce(Supplicant Nonce)

    2. MIC(Message Integrity Code,消息完整性校验码)

    3. 客户端的RSN IE(安全能力信息)

  • 关键过程

    1. 客户端收到ANonce后,结合自己已知的PMK、SNonce、以及双方MAC地址,使用PRF函数计算出PTK

      PTK = PRF(PMK, "Pairwise key expansion", 
                Min(AA,SA) || Max(AA,SA) || 
                Min(ANonce, SNonce) || Max(ANonce, SNonce))
    2. PTK被分为多个部分:KCK(用于计算MIC)、KEK(用于加密后续密钥)、TK(用于加密数据)

    3. 客户端使用KCK对M2报文(除MIC字段外)计算MIC,并将MIC填入报文

  • 目的

    1. 提供第二个随机数(SNonce)

    2. 首次证明“我拥有正确的PMK”(因为只有拥有正确PMK才能计算出正确的MIC)

第3步:密钥安装与组播密钥下发(M3)

接入点 → 客户端:发送 EAPOL-Key 帧(M3)

  • 包含

    1. 再次发送ANonce(或标识)

    2. MIC(使用AP计算出的KCK)

    3. 加密的GTK(Group Temporal Key,组临时密钥)

    4. 安装指示标志

  • 关键过程

    1. AP收到M2后,使用SNonce和存储的PMK以相同方式计算出PTK

    2. AP使用自己计算出的KCK验证M2中的MIC

      • 验证成功:证明客户端确实拥有正确的PMK

      • 验证失败:握手终止,连接拒绝

    3. AP使用KEK加密GTK,并将加密后的GTK放入M3

    4. AP计算M3的MIC,并安装TK(开始使用TK加密单播数据)

  • 目的

    1. 确认客户端的PMK有效

    2. 下发用于解密组播/广播数据的GTK

    3. 指示客户端安装密钥

第4步:最终确认(M4)

客户端 → 接入点:发送 EAPOL-Key 帧(M4)

  • 包含

    1. MIC

    2. 确认安装标志

  • 关键过程

    1. 客户端使用KEK解密GTK并存储

    2. 客户端验证M3的MIC

    3. 客户端安装TK和GTK(开始使用TK加密数据)

    4. 发送M4作为最终确认

  • 目的

    1. 确认GTK接收成功

    2. 确认密钥已安装

    3. 握手完成

安全意义分析

  1. 双向认证:M2证明了客户端有PMK,M3证明了AP有PMK

  2. 密钥新鲜性:每次握手使用新的随机数(Nonce),确保每次会话的PTK都不同

  3. 前向安全性:即使PSK泄露,过去的会话记录也无法解密(因为每次PTK不同)

  4. 抵抗重放攻击:通过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的关键区别:
  1. Key Info字段不同:M3包含Install标志(表示安装密钥)

  2. Key Data内容不同:M3包含加密的GTK

  3. Nonce不同:M3使用与M1相同的Anonce

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐