详细过程可参考《802.11-2012》11.6.6 4-Way Handshake
WPA2 或者WPA认证在association成功前都是基于open的认证方式,然后在association以后通过四次握手协商出PTK和GTK
四次握手的目的:
1.Client生成SNonce并告知AP
2.AP生成ANonce并告知Client
3.AP和Client自己计算出PMK,并通过PMK在四次握手中衍生出PTK,GTK,并在四次握手中验证对方的PTK和GTK是正确的。
PTK(pairwise transient key):成对传输秘钥,它用于单播数据帧的加密和解密
GTK(group temporal key):组临时秘钥,它用于组播数据帧和广播数据帧的加密和解密,管理帧、控制帧和空数据帧是不用加密的。
四次握手前需要具备的初始化参数值:
AA:client的MAC
SPA:AP的MAC
ANonce:AP产生的随机值
SNonce:Client 产生的随机值
PMK
不同的协议需要不同的方式获取初始参数值:
对于PSK和EAP,AA、SPA、ANonce、SNonce这四个值的获取方式没有区别都是现成的或者随机生成的。但是PMK不一样:
PSK:PMK由SSID和密码等导出,公式如下
PMK=PSK=pdkdf2_SHA1(passphrase,SSID,SSID length, 4096), 其中passphrase就是客户输入的登录密码
EAP:在Radius认证成功后,AP和client同时会获得一个相同的key(MSK, 这个可以参考另外一篇文章802.1x+EAP的认证过程.)这个key就是用于派生出PMK.
PMK=L(MSK, 0, 256)
如何计算PTK:
PMK转化成PTK是通过下面的函数完成的:
PTK<----PRF-X(pPMK, "Pairwise key expansion", Min(AA,SPA)||Max(AA,SPA)||Min(ANoce,SNoce)||Max(ANonce, SNoce))
(1)X指生成的PTK的长度,X=256+TK_bit,即256加上对应加密的TK位数,不同的加密方式TK_bits不一样。可查下表:
(2)KCK ← L(PTK, 0, 128),它是PTK的前128bit(0-127),用于计算密钥生成消息的完整性校验值.使用方法可参考四次握手流程里面。
(3)KEK ← L(PTK, 128, 128),它是PTK的中间128bit(128–255),用来加密密钥生成消息。使用方法可以参考四次握手流程
(4)TK ← L(PTK, 256, TK_bits),它是PTK中256bit以后的所有位(256 — 255 + TK_bits),用来对数据包中的数据进行加密。从表中可看出,对于TKIP加密PTK的长度是512bit, 对于CCMP加密PTK的长度是384bit。
四次握手的流程:
四次握手第一个报文:
发送方向:AP---->Station
携带参数:ANonce
第一次我握手后,Client将会获取到AP的ANonce和AA,这个时候client已经拥有了可以计算出PTK的所有参数,通过
PTK=PRF(PMK+ANonce+SNonce+AA+SPA)
Client将会派生出密钥PTK。生成的PTK前128位是KCK,用于计算密钥生成消息的完整性密钥值。
四次握手第二个报文:
发送方向:Station------>AP
携带参数:SNonce和MIC。其中MIC=mic(KCK,EAPOL),计算方法是令这个第二个报文的初始key mic为0,然后使用KCK加密该EAPOL报文得到报文完整性校验值即为WPA KEY MIC的值。
第二次握手后,AP将会从client处得到SNonce和已经计算好的MIC, 这个时候AP拥有了所有能计算出PTK的参数,然后AP将进行同样的计算得到PTK, 然后用得到的前128位对EAPOL报文进行完整性校验,看得到的值是否和收到报文中的WPA KEY MIC的值一致,如果一致,则验证成功,说明client端拥有的PMK是正确的,否则判定Client端拥有的PMK错误,整个握手就此停止。
AP对于第二个包的处理流程:
1.检查重播计数器看是否和第一包相关联,如果不是AP将默默丢掉报文
2.生成PTK
3.根据生成的PTK,得到前128位为KCK,然后计算EAPOL报文得到MIC值,如果不相等,AP将默默丢掉报文
4.如果MIC是相等的,且没有打开roaming,AP将会check 第二个EAPOL报文中携带的RSNE信息和Association request报文中的RSNE信息是否一致。
i)如果不完全一致,AP发送MLME-DEAUTHENTICATE去终止这次关联
ii)如果完全比配,AP开始构造四次握手的报文三。
四次握手的第三个报文:
发送方向:AP------>Station
携带参数:组临时密钥GTK, WPA KEY MIC
GTK:用于后续更新组密钥,该密钥被KEK加密,KEK是PTK的中间128bit,MIC同样是KCK加密得来
GTK被包含于KEY DATA中.
KEY DATA中包含的数据有:AP在Beacon或者Probe Response中包含的RSNE,GTK,如果管理帧保护同样被协商了,也包含IGTK KDE。。。。。
Client收到报文三后
1. 如果key Reply Counter的值已经被使用或者报文三中的ANonce和报文一种的不一样,则Client默默丢弃该报文
2.利用KEK解密查看报文三中的RSNE, 如果没有开启Roaming,对比Station收到的AP发送的Beason或者Probe Response的RSNE,如果不匹配,取消关联AP,如果信息中有提供第二个RSNE,Client使用第二个RSNE中指定的密钥套件或者取消认证
3.检查MIC,同第二个报文检查流程一样,如果不一致,将默默丢弃第三个报文
步骤2和3的目的都是为了验证AP拥有正确的PMK
4.更新最后看到key replay Counter 的值
5.构造第四个报文
四次握手第四个报文:
发送方向:Station------>AP
携带参数:WPA KEY MIC
Client 最后发送一次EAPOL-KEY给AP用于确认,如果认证成功,双方将安装(Install)key,Install的意思是指使用它们来对数据进行加密。
AP在收到第四个报文后
1.检查Key Replay Counter的值,如果不是四次握手中使用的那个,就默默丢弃这个报文,如果是继续下面的流程
2.检查MIC,通报文二,三的检查方法一直,如果不一样默默丢弃该报文,如果一样,将告诉802.11 MAC去使用新的PTK发送或者接受MPDU
3.AP更新KEY Replay Counter的值,以方便需要rekey的时候能使用新值
Controlled Port Unlocked
双方完成认证以后,authenticator的控制端口将会被打开,这样802.11的数据帧将能够正常通过,而且所有的单播数据帧将会被PTK保护,所有的组播数据以及广播数据将会被GTK保护。
Supplicant和Authenticator就此完成密钥派生和组对, 双方可以正常进行通信了
后续:
每个STA都有一个独立的PTK,所有的STA和AP共同拥有一个相同的GTK。如下图所示:
比如我们比较常见的TKIP和CCMP混合加密,前者用于兼容旧的设备,后者用于规范新的加密, 一般来说,为了兼容不同版本的设备, GTK会使用TKIP加密(因为GTK是所有设备共享的), PTK既可以是TKIP加密,也可以是CCMP加密。如下图所示: