背景:在2018年1月8日,美国拉斯维加斯的国际消费电子展(CES)上,Wi-Fi联盟发布了最新的WPA3加密协议,作为WPA2技术的后续版本。并在2018年6月26日,WiFi联盟宣布WPA3协议已最终完成。WPA3中最大的改进是将原来的四次握手协议换成了新的Dragonfly Key Exchange协议,该协议将认证和秘钥交换合并为一个协议。WPA3号称可以解决WPA2中未解决的几个安全问题,如离线密码破解、前向安全和其他已知攻击方法。
根据Wi-Fi联盟官方发布的文档,WPA3分为WPA3个人级和WPA3企业级两种标准。WPA3企业级认证与WPA2相比差别不大,仅将密钥长度增加到了192位。而WPA3个人级相对于WPA2个人级的改进主要体现在以下几个方面:更强的基于密码的认证安全、使用等量同步认证的蜻蜓协议,以及密钥长度扩展到192位。
#!/usr/bin/env python
import hmac
from hashlib import pbkdf2_hmac,sha1,md5
def PRF(key,A,B):
nByte = 48
i = 0
R = ''
while ( i <= ((nByte*8 + 159)/160)):
hmacsha1 = hmac.new(key,A+"x00" + B + chr(i),sha1)
R += hmacsha1.digest()
i += 1
return R[0:nByte]
def MakeAB(aNonce,sNonce,apMac,cliMac):
A = "Pairwise key expansion"
B = min(apMac,cliMac) + max(apMac,cliMac) + min(aNonce, sNonce) + max(aNonce, sNonce)
return (A,B)
def MakeMIC(pwd,ssid,A,B,data,wpa = False):
pmk = pbkdf2_hmac('sha1',pwd,ssid,4096,32)
ptk = PRF(pmk,A,B)
hmacFunc = md5 if wpa else sha1
mics = [hmac.new(ptk[0:16],i,hmacFunc).digest() for i in data]
return (mics,ptk,pmk)
def calcKey(essid,psk,apMac,cliMac,data0,data1,data2,data3):
ssid = essid
#print ssid
aNonce = data0[17:17+32]
#print aNonce.encode('hex')
sNonce = data1[17:17+32]
#print sNonce.encode('hex')
apMac = apMac.replace(':','').decode("hex")
cliMac = cliMac.replace(':','').decode("hex")
mic1 = data1[81:81+16]
data1 = data1.replace(mic1,'x00'*16)
mic2 = data2[81:81+16]
data2 = data2.replace(mic2,'x00'*16)
mic3 = data3[81:81+16]
data3 = data3.replace(mic3,'x00'*16)
A,B = MakeAB(aNonce,sNonce,apMac,cliMac)
mics,ptk,pmk = MakeMIC(psk,ssid,A,B,[data1,data2,data3])
print "pmk:",pmk.encode('hex')
print "ptk:",ptk.encode('hex'),"len:",len(ptk)*8
print "desired mic1:",mic1.encode('hex')
print "acture mic1:",mics[0].encode('hex')[:-8]
if (mic1==mics[0][:-4]):
print "MIC1 MATCHED"
print "desired mic2:",mic2.encode('hex')
print "acture mic2:",mics[1].encode('hex')[:-8]
if (mic2==mics[1][:-4]):
print "MIC2 MATCHED"
print "desired mic3:",mic3.encode('hex')
print "acture mic3:",mics[2].encode('hex')[:-8]
if (mic3==mics[2][:-4]):
print "MIC3 MATCHED"
return ptk
在WPA2中,设备入网认证的过程需要进行多次交互,包括Probe Request、Probe Response、Authentication Request、Authentication Response、Association Request和Association Response。而在WPA3中,前三次交互与WPA2相同,但密钥交换过程有所改变。在WPA2中,密钥交换过程需要通过计算PTK来生成密钥,而PTK的计算依赖于PSK,这使得WPA2无法提供前向安全。然而,在WPA3中,使用Dragonfly Key Exchange算法,通过生成P和R来计算密钥,从而实现了前向安全。
在WPA3中,蜻蜓密钥交换算法的核心是通过PSK生成P,并通过计算生成密钥。该算法与Diffie-Hellman算法相似,但在计算过程中引入了离散对数问题,从而保证了前向安全性。然而,蜻蜓算法并不能完全防止中间人攻击,且对于离线字典攻击也没有严格的证明。虽然WPA3在安全性方面有所提升,但仍需注意密码的选择和网络环境的安全性。
总结来说,WPA3的蜻蜓密钥交换算法在提供前向安全性方面具有优势,但仍存在中间人攻击和离线字典攻击的风险。对于WPA3的实际应用和安全性细节,还需要进一步的工程实践和研究。