前言
WPA(WiFi 保护接入)目前有WPA、WPA2和WPA3三个版本,高版本强化了安全性和设备支持等等,本篇不对每一种认证都展开比较,只针对WPA接入的流程做讲解。
WPA分为两个流程,一个是STA(接入的终端设备)与AP(无线接入点)的关联流程,另一个就是认证流程。
关联流程
首先,STA会主动广播Probe帧,用于探测周围可用WIFI,AP收到后会向STA告知当前的SSID(可认为是WIFI名称),然后是用户搜索到WIFI后,点击要连接的WIFI,开始进行关联和认证流程:
(1)STA向选定SSID所在的AP发送Authentication Req报文,向AP表明自己的算法类型(0-open System;1-Shared Key),open System可以认为当前不需要身份的认证,放在后面的四次握手来做;Shared Key表示使用WEP加密,如果选择了SharedKey,那就不需要后面的四次握手认证过程了。最后对SharedKey来单独讲解;
(2)AP对认证请求进行响应;
(3)STA发送关联请求,包括SSID,支持的速率,信道等等;
(4)AP响应关联请求,告知STA自己支持的一些802.11参数
经过这四步,关联已经完成,如果之前在认证过程中,选用的算法类型是open System,那么接下来会进行空口的4次握手,握手完成后STA才可以接入到WiFi;
名词详解
认证过程是通过802.1x来进行的,下面对四次握手中比较重要的字段做解释:
PSK(Pairwise Shared Key):预共享密钥(共享密码),PSK=PMK=pdkdf2_SHA1(passphrase,SSID,SSID length,4096);
PMK(Pairwise Master Key):成对主密钥,是申请者和认证者之间所有密码数据推导的主要来源。由PSK直接得到。同时也可以由身份验证过程中EAP过程来推导得出(下一篇文章讲解),或者直接由PSK来提供;
PTK(pairwise transient key):成对传输秘钥,它用于单播数据帧的加密和解密,PTK = PRF-X(PMK,”pairwisekey expansion”,
min(AA,SPA)||MAX(AA,SPA)||MIN(ANONCE,SNonce)||max(ANonce,SNonce));
根据802.11,上图中PTK主要由3部分组成,其中KCK用于MIC值的计算,用于校验消息完整性;KEK 用于四次握手中的WPA Data的加密;TK主要用于后续用户数据的加密。
GMK (Group Master Key):组主密钥,可以是一个随机数
GTK (Group Temporal Key):组临时密钥,由组主密钥(GMK)通过哈希运算生成,是用于加密广播和组播数据流的加密密钥,GTK = PRF-X(GMK, “Group key expansion” || AA || GNonce)
AA:STA的MAC地址;
SPA:AP的MAC地址;
ANonce:AP产生的随机值;
SNonce:STA产生的随机值;
MIC(Message Integrity Code):消息完整性代码,由KCK与当前802.1x的数据帧做一个hash计算,如果当前802.1x数据帧中的MIC值与接收方通过上述方法计算得到的值一致,则校验通过,否则四次握手终止。
认证流程
Supplicant就是STA,Authticator就认为是AP,也可能是AP中部署的hostapd等
(1)第一次握手,由AP广播自己的EAPOL报文,其中包含了AP的随机数(ANonce);
(2)第二次握手,STA产生自己的随机数,填充802.1x报文,通过上述方式计算出PTK,推导出KCK后,与802.1x报文一起计算MIC值,然后发送第二个EAPOL报文,报文中主要包括:SPA和MIC;
(3)第三次握手,AP收到STA的第二次握手报文后,可以拿到SPA和MIC值,通过上述计算PTK的方式,算出PTK并推导出KCK,然后计算MIC值与二次握手报文中的MIC值进行比对,如果不一致则结束认证流程;如果一致,则构造第三次握手EAPOL报文,主要包括使用GMK,ANonce,AA生成GTK,使用KEK来加密GTK;计算当前的MIC值;
(4)第四次握手,STA收到第三次握手后,首先先计算MIC值,如果不一致,则握手失败;一致,则使用PTK推导的KEK对GTK进行解密,然后将TK安装到系统中,作为后续数据加密的密钥,然后最后一次握手回复一个ACK消息给AP,表示密钥已经安装完毕,这个消息中主要包含一个MIC值。
AP收到这个EAPOL消息后,也会进行密钥安装,至此,四次握手已经结束,STA可以安全的接入网络。
最后说一下前面提到的,使用WEP加密方式来进行认证:
a.STA发起认证请求,携带认证算法类型为:Shared Key;
b.AP 回复一个挑战明文(challage text),可认为是一个随机数;
c.STA 使用预设密钥对挑战明文进行加密,然后发送给AP;
d.AP收到后,使用密钥对收到的信息进行解密,如果解密成功且明文一致则表示认证成功,回复successful。