什么是四次握手?
四次握手是接入点(认证方,authenticator)与客户端设备(请求方,supplicant)之间交换 4 条消息的过程,目的是生成加密密钥,用于对无线介质上传输的实际数据进行加密。这些通过四次握手生成的密钥源自某种原始密钥材料,我们会在后续内容中展开介绍。
以下是我们将要讨论的几个关键密钥:
- MSK(Master Session Key,主会话密钥)
- PMK(Pairwise Master Key,成对主密钥)
- GMK(Group Master Key,组主密钥)
- PTK(Pairwise Transient Key,成对临时密钥)
- GTK(Group Temporal Key,组临时密钥)
- ANonce(接入点生成的随机数)
- SNonce(客户端生成的随机数)
- MIC(Message Integrity Code,消息完整性校验码)
我会先介绍四次握手过程中生成的密钥,再讲解生成这些密钥所需的其他密钥和变量。
PTK(Pairwise Transient Key,成对临时密钥)
成对临时密钥用于加密客户端站点与接入点之间的所有单播流量。每个客户端与接入点之间的 PTK 都是唯一的。
生成 PTK 时,客户端设备与接入点需要以下信息:
PTK = PRF(PMK + Anonce + SNonce + Mac(AA) + Mac(SA))
其中:
- Anonce:接入点(认证方)生成的随机数
- SNonce:客户端设备(请求方)生成的随机数
- Mac(AA):认证方(接入点)的 MAC 地址
- Mac(SA):请求方(客户端设备)的 MAC 地址
- PRF:伪随机函数,用于对所有输入信息进行计算
PTK 依赖于更上层的密钥 ------PMK(成对主密钥),我们将在下文介绍。
GTK(Group Temporal Key,组临时密钥)
组临时密钥用于加密接入点与多个客户端设备之间的所有广播和组播流量。
它是接入点与所有关联客户端设备共享的密钥。每个接入点都有独立的 GTK,并仅与自己关联的设备共享。
GTK 依赖于更上层的密钥 ------GMK(组主密钥),我们将在下文介绍。
PMK(Pairwise Master Key,成对主密钥)
什么是 PMK?为什么需要它?
我们已经了解了 PTK 和 GTK,而 PTK 正是在 PMK 的辅助下生成的。如前文所述,生成 PTK 需要以下输入:
PTK = PRF(PMK + Anonce + SNonce + Mac(AA) + Mac(SA))
成对主密钥由主会话密钥(MSK)生成。在 WPA2/PSK 场景中,设备与接入点完成认证后,PSK 就会成为 PMK。
💡 要点提示:PMK 同时存储在接入点和客户端设备中,因此无需在网络中传输该信息。我们利用它生成 PTK,用于单播数据的加密。
GMK(Group Master Key,组主密钥)
组主密钥在四次握手中用于生成前文提到的 GTK。GTK 由每个接入点独立生成,并仅与连接到该接入点的设备共享。
MSK(Master Session Key,主会话密钥)
主会话密钥是第一个生成的密钥,它源自 802.1X/EAP 认证流程,或由 PSK 认证过程推导而来。
密钥层级关系(从顶层到底层)
我们从底层到顶层介绍了这些密钥,以及它们之间的依赖关系。现在换个视角,从顶层到底层来看:
- 第一层密钥:在 802.1X/EAP 或 PSK 认证过程中生成 MSK。
- 第二层密钥:由 MSK 生成 PMK 和 GMK。其中 PMK 用于生成 PTK,GMK 用于生成 GTK。
- 第三层密钥:PTK 和 GTK 是实际用于数据加密的密钥。

(Keys Hierarchy)
四次握手实战演示
既然我们已经了解了关键密钥及其生成方式,接下来就看看实际的四次握手过程。
假设一个接入点配置了 WPA2/PSK 加密,现在有一台设备正尝试接入。在我们的示例中,SSID 为 PRINTERS ,密码为 printer123。


你一点击 "printers" 这个 SSID,设备就会进入我在另一篇文章里提到的一系列状态流程。从认证到关联,再到安全校验,四次握手正是发生在这个阶段。
与直接向接入点发送密码不同,此过程中会通过 EAPOL(局域网扩展认证协议,Extensible Authentication Protocol over LAN)来交换消息。

(4-way handshake)
设备状态:
设备会经历从认证到关联的一系列状态变化。当设备完成认证与关联后,就会进入安全校验阶段,四次握手也随之启动。

四次握手的 Wireshark 抓包视图

消息 1:接入点向客户端发送包含 Anonce(随机数)的 EAPOL 消息,用于生成 PTK
别忘了,客户端设备已经知道接入点的 MAC 地址(因为它已经连接到接入点),同时它也持有 PMK、自己生成的 SNonce,以及自身的 MAC 地址。所以当客户端收到接入点发来的 Anonce 后,就拥有了生成 PTK 所需的全部输入信息。
公式:
PTK = PRF(PMK + Anonce + SNonce + Mac(AA) + Mac(SA))
在本例中:
- 接入点的 MAC 地址(源地址)为
9c:5d:12:5e:6c:66,它是发送第一条 EAPOL 消息的设备 - 客户端设备的 MAC 地址为
d0:c5:f3:a9:16:c5 - 这条消息的作用就是接入点将 Anonce 发送给客户端


(Anonce from AP to the device)
消息 2
当客户端设备生成自己的 PTK 后,会向接入点发送 SNonce------ 这也是接入点生成 PTK 所必需的信息。
客户端会发送一条包含 MIC(消息完整性校验码)的 EAPOL 消息 2,这样接入点就能验证该消息是否被篡改或损坏。
一旦接入点收到 SNonce,它也可以生成 PTK,用于后续单播流量的加密。
这是从客户端设备发往接入点的第二条消息,其中包含 SNonce,并且 MIC 字段被置为 1。


消息 3
EAPOL 消息 3 由接入点发送给客户端设备,其中包含 GTK(组临时密钥)。该 GTK 由接入点独立生成,生成过程无需客户端参与,其来源是 GMK(组主密钥)。


(Message 3)
消息 4
第四条,也就是最后一条 EAPOL 消息,由客户端发送给接入点,仅用于确认所有密钥已成功安装生效。

四次握手结果
控制端口解锁:四次握手成功完成后,原本会阻断所有流量的虚拟控制端口将被打开,此时加密流量即可正常传输。此后,所有单播流量将通过 PTK 加密,所有组播流量将通过四次握手过程中生成的 GTK 加密。
总结
我们来总结一下前面讨论的全部内容:
我广播了名为PRINTERS的 SSID 并尝试接入该网络。接入点在持续广播 SSID,当我点击 "PRINTERS" SSID 发起连接时,可以看到包含确认帧的完整交互过程。
设备向接入点发起连接请求,接入点以探测响应帧进行回应。随后,设备从 "未认证、未关联" 状态,依次进入 "已认证、已关联" 状态。
完成认证与关联后,设备进入安全校验阶段,触发四次握手。四次握手成功完成后,控制端口将被打开,设备与接入点即可开始加密通信。

(从关联到四次握手完成的完整交互过程)
总结:
文章主要介绍了四次握手,主要流程就是通过是无线接入点与客户端通过4条EAPOL消息生成加密密钥的过程,先由AP发ANonce,客户端回SNonce与MIC,AP再发GTK,客户端最后确认。过程生成PMK、PTK、GTK等密钥,PTK加密单播流量,GTK加密组播/广播流量,握手成功后解锁端口实现加密通信。
其实流程很简单,其实大家一直都知道,只不过很多人没有抓过sniffer去仔细看过,希望我的文章对大家有帮助。