詳細(xì)過程可參考《802.11-2012》11.6.6 4-Way Handshake
WPA2 或者WPA認(rèn)證在association成功前都是基于open的認(rèn)證方式,然后在association以后通過四次握手協(xié)商出PTK和GTK
四次握手的目的:
1.Client生成SNonce并告知AP
2.AP生成ANonce并告知Client
3.AP和Client自己計算出PMK,并通過PMK在四次握手中衍生出PTK,GTK,并在四次握手中驗證對方的PTK和GTK是正確的。
PTK(pairwise transient key):成對傳輸秘鑰,它用于單播數(shù)據(jù)幀的加密和解密
GTK(group temporal key):組臨時秘鑰,它用于組播數(shù)據(jù)幀和廣播數(shù)據(jù)幀的加密和解密,管理幀、控制幀和空數(shù)據(jù)幀是不用加密的。
四次握手前需要具備的初始化參數(shù)值:
AA:client的MAC
SPA:AP的MAC
ANonce:AP產(chǎn)生的隨機(jī)值
SNonce:Client 產(chǎn)生的隨機(jī)值
PMK
不同的協(xié)議需要不同的方式獲取初始參數(shù)值:
對于PSK和EAP,AA、SPA、ANonce、SNonce這四個值的獲取方式?jīng)]有區(qū)別都是現(xiàn)成的或者隨機(jī)生成的。但是PMK不一樣:
PSK:PMK由SSID和密碼等導(dǎo)出,公式如下
PMK=PSK=pdkdf2_SHA1(passphrase,SSID,SSID length, 4096), 其中passphrase就是客戶輸入的登錄密碼
EAP:在Radius認(rèn)證成功后,AP和client同時會獲得一個相同的key(MSK, 這個可以參考另外一篇文章802.1x+EAP的認(rèn)證過程.)這個key就是用于派生出PMK.
PMK=L(MSK, 0, 256)
如何計算PTK:
PMK轉(zhuǎn)化成PTK是通過下面的函數(shù)完成的:
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加上對應(yīng)加密的TK位數(shù),不同的加密方式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),用來對數(shù)據(jù)包中的數(shù)據(jù)進(jìn)行加密。從表中可看出,對于TKIP加密PTK的長度是512bit, 對于CCMP加密PTK的長度是384bit。
四次握手的流程:
四次握手第一個報文:
發(fā)送方向:AP---->Station
攜帶參數(shù):ANonce
第一次我握手后,Client將會獲取到AP的ANonce和AA,這個時候client已經(jīng)擁有了可以計算出PTK的所有參數(shù),通過
PTK=PRF(PMK+ANonce+SNonce+AA+SPA)
Client將會派生出密鑰PTK。生成的PTK前128位是KCK,用于計算密鑰生成消息的完整性密鑰值。
四次握手第二個報文:
發(fā)送方向:Station------>AP
攜帶參數(shù):SNonce和MIC。其中MIC=mic(KCK,EAPOL),計算方法是令這個第二個報文的初始key mic為0,然后使用KCK加密該EAPOL報文得到報文完整性校驗值即為WPA KEY MIC的值。
第二次握手后,AP將會從client處得到SNonce和已經(jīng)計算好的MIC, 這個時候AP擁有了所有能計算出PTK的參數(shù),然后AP將進(jìn)行同樣的計算得到PTK, 然后用得到的前128位對EAPOL報文進(jìn)行完整性校驗,看得到的值是否和收到報文中的WPA KEY MIC的值一致,如果一致,則驗證成功,說明client端擁有的PMK是正確的,否則判定Client端擁有的PMK錯誤,整個握手就此停止。
AP對于第二個包的處理流程:
1.檢查重播計數(shù)器看是否和第一包相關(guān)聯(lián),如果不是AP將默默丟掉報文
2.生成PTK
3.根據(jù)生成的PTK,得到前128位為KCK,然后計算EAPOL報文得到MIC值,如果不相等,AP將默默丟掉報文
4.如果MIC是相等的,且沒有打開roaming,AP將會check 第二個EAPOL報文中攜帶的RSNE信息和Association request報文中的RSNE信息是否一致。
? ? i)如果不完全一致,AP發(fā)送MLME-DEAUTHENTICATE去終止這次關(guān)聯(lián)
? ? ii)如果完全比配,AP開始構(gòu)造四次握手的報文三。
四次握手的第三個報文:
發(fā)送方向:AP------>Station
攜帶參數(shù):組臨時密鑰GTK, WPA KEY MIC
GTK:用于后續(xù)更新組密鑰,該密鑰被KEK加密,KEK是PTK的中間128bit,MIC同樣是KCK加密得來
GTK被包含于KEY DATA中.
KEY DATA中包含的數(shù)據(jù)有:AP在Beacon或者Probe Response中包含的RSNE,GTK,如果管理幀保護(hù)同樣被協(xié)商了,也包含IGTK KDE。。。。。
Client收到報文三后
1. 如果key Reply Counter的值已經(jīng)被使用或者報文三中的ANonce和報文一種的不一樣,則Client默默丟棄該報文
2.利用KEK解密查看報文三中的RSNE, 如果沒有開啟Roaming,對比Station收到的AP發(fā)送的Beason或者Probe Response的RSNE,如果不匹配,取消關(guān)聯(lián)AP,如果信息中有提供第二個RSNE,Client使用第二個RSNE中指定的密鑰套件或者取消認(rèn)證
3.檢查MIC,同第二個報文檢查流程一樣,如果不一致,將默默丟棄第三個報文
步驟2和3的目的都是為了驗證AP擁有正確的PMK
4.更新最后看到key replay Counter 的值
5.構(gòu)造第四個報文
四次握手第四個報文:
發(fā)送方向:Station------>AP
攜帶參數(shù):WPA KEY MIC
Client 最后發(fā)送一次EAPOL-KEY給AP用于確認(rèn),如果認(rèn)證成功,雙方將安裝(Install)key,Install的意思是指使用它們來對數(shù)據(jù)進(jìn)行加密。
AP在收到第四個報文后
1.檢查Key Replay Counter的值,如果不是四次握手中使用的那個,就默默丟棄這個報文,如果是繼續(xù)下面的流程
2.檢查MIC,通報文二,三的檢查方法一直,如果不一樣默默丟棄該報文,如果一樣,將告訴802.11 MAC去使用新的PTK發(fā)送或者接受MPDU
3.AP更新KEY Replay Counter的值,以方便需要rekey的時候能使用新值
Controlled Port Unlocked
雙方完成認(rèn)證以后,authenticator的控制端口將會被打開,這樣802.11的數(shù)據(jù)幀將能夠正常通過,而且所有的單播數(shù)據(jù)幀將會被PTK保護(hù),所有的組播數(shù)據(jù)以及廣播數(shù)據(jù)將會被GTK保護(hù)。
Supplicant和Authenticator就此完成密鑰派生和組對, 雙方可以正常進(jìn)行通信了
后續(xù):
每個STA都有一個獨立的PTK,所有的STA和AP共同擁有一個相同的GTK。如下圖所示:
比如我們比較常見的TKIP和CCMP混合加密,前者用于兼容舊的設(shè)備,后者用于規(guī)范新的加密, 一般來說,為了兼容不同版本的設(shè)備, GTK會使用TKIP加密(因為GTK是所有設(shè)備共享的), PTK既可以是TKIP加密,也可以是CCMP加密。如下圖所示: