Wi-Fi AKM和cipher suite
简介
AKM和cipher suite保护了Wi-Fi中的数据传输。
- cipher suite:可以理解为一种算法,输入明文、密钥以及其他参数,输出密文以及MIC,保证数据的机密性和完整性。
- AKM:规定了如何进行WLAN连接中的authentication,负责生成cipher suite中用到的密钥。
单播中会用到的三种key
- PMK(pairwise master key):AKM 的产物之一,用于派生后续会用到的PTK、TK
- PTK(pairwise transient key):由PMK 派生而来,分为三部分,KCK、KEK、TK,例如一个384位的PTK(SAE
00-0F-AC:8
+ CCMP-128),它的前128位是KCK,中间128位是KEK,最后128位为TK - TK(temporal key):cipher suite中的密钥
需要明确一点,这三种key的生成都是AKM的范畴,也就是说,他们的生成方式是由AKM规定的。但不同的cipher suite对TK(当然也会影响PTK)的长度有要求。
PMK
AKM 规定了PMK 的生成方式,以下是常见AKM的PMK生成方式。
- WPA/WPA2-PSK(00-0F-AC:2):直接使用PSK 作为PMK,PSK 由如下公式计算得出。所有association 的PMK 都是相同的。
P S K = P B K D F 2 ( p a s s P h r a s e , s s i d , 4096 , 256 / 8 ) PSK = \mathrm{ PBKDF2}(passPhrase, ssid, 4096, 256/8) PSK=PBKDF2(passPhrase,ssid,4096,256/8) - SAE(00-0F-AC:8):在authentication过程中STA和AP协商PMK
- 各种EAP认证:EAP认证成功后authenticator向supplicant分发MSK,MSK截断一定长度得到PMK
AKM 不仅规定了PMK 的生成方式,还规定了PMK 的长度。例如,大部分AKM都采用256位的PMK,而suite_B_192(00-0F-AC:12) 则使用384位的PMK。(IEEE80211-2020 12.7.1.3 Pairwise key hierarchy)。
利用PMK生成PTK(包含TK)
PMK 不会直接用于数据加密,而是会用来派生PTK。如下图所示,在802.11中,使用伪随机函数PRF 生成PTK。
- AA: Authenticator address, 即 AP的地址
- SPA: Supplicant address, 即STA的地址
- ANonce、SNonce: 在EAPOL四次握手中分别由AP和STA产生的随机数
PRF-Length
PRF-Length 是一个伪随机函数,它接受密钥以及数据作为输入,生成一个新的密钥。作为参数输入的密钥是PMK,而生成的新的密钥是PTK。Length代表它输出的密钥的长度。
PRF-Length 的形式如下。它的具体实现就是利用HMAC-Hash多次生成MAC(消息验证码) 然后拼接在一起,直至达到长度Length。
- HMAC-Hash: 它代表一个消息校验码算法。Hash函数只有一个参数,即需要进行Hash的数据。HAMC可以将Hash函数转换为消息验证码生成算法,转换后的HMAC-Hash接受两个参数,key以及需要验证的数据,HMAC-Hash输出的结果与原Hash长度相同。
- Length:输出结果的长度,例如PRF-384输出384位的结果。
从PRF-Length 的实现也可以看出生成PTK 所需的PRF 由HMAC-Hash 和Length 所确定。HMAC-Hash 是由AKM 所规定的,而Length 则由AKM 和 Cipher suite 共同决定。PTK 由三部分组成,KCK、KEK 和 TK,如下表所示,AKM决定了KCK和KEK的长度,而cipher suite 规定了TK 的长度。例如,当AKM 是SAE(00-0F-AC:8
),cipher suite 是 CMMP-128 时,应使用PRF-384,若AKM是PSK(00-0F-AC:2
) 而cipher suite 是TKIP,则应使用PRF-512。
AKM | Integrity algorithm | KCK_bits | Size of MIC | Key wrap algorithm | KEK_bits | KCK2_bits | KEK2_bits |
---|---|---|---|---|---|---|---|
Deprecated | HMAC-MD5 | 128 | 16 | ARC4 | 128 | 0 | 0 |
00-0F-AC:1 | HMAC-SHA-1-128 | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:2 (PSK) | HMAC-SHA-1-128 | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:3 | AES-128-CMAC | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:4 | AES-128-CMAC | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:5 | AES-128-CMAC | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:6 | AES-128-CMAC | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:8 (SAE) | AES-128-CMAC | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:9 | AES-128-CMAC | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:11 | HMAC-SHA-256 | 128 | 16 | NIST AES Key Wrap | 128 | 0 | 0 |
00-0F-AC:12 | HMAC-SHA-384 | 192 | 24 | NIST AES Key Wrap | 256 | 0 | 0 |
00-0F-AC:13 | HMAC-SHA-384 | 192 | 24 | NIST AES Key Wrap | 256 | 0 | 0 |
00-0F-AC:14 | AES-SIV-256 | 0 | 0 | AES-SIV-256 | 256 | 0 | 0 |
00-0F-AC:15 | AES-SIV-512 | 0 | 0 | AES-SIV-512 | 512 | 0 | 0 |
00-0F-AC:16 | AES-SIV-256/AES-128-CMAC | 0 | 0/16 | AES-SIV-256/NIST AES Key Wrap | 256 | 128 | 128 |
00-0F-AC:17 | AES-SIV-512/HMAC-SHA-384 | 0 | 0/24 | AES-SIV-512/NIST AES Key Wrap | 512 | 192 | 256 |
Cipher suite | Key length (octets) | TK_bits (bits) |
---|---|---|
WEP-40 | 5 | 40 |
WEP-104 | 13 | 104 |
TKIP | 32 | 256 |
CCMP-128 | 16 | 128 |
BIP-CMAC-128 | 16 | 128 |
GCMP-128 | 16 | 128 |
GCMP-256 | 32 | 256 |
CCMP-256 | 32 | 256 |
BIP-GMAC-128 | 16 | 128 |
BIP-GMAC-256 | 32 | 256 |
BIP-CMAC-256 | 32 | 256 |
EAPOL 4-way handshake
EAPOL 4-way handshake 中用到的帧是 EAPOL key frame,它的格式如下。
PTK 的生成
- 在message 1 中,AP 向 STA 发送随机数 ANonce。
- STA 收到 message 1 后,便可根据 ANonce、SNonce、AA、SPA 以及 PMK 生成 PTK。然后向AP发送message 2。
- AP 收到 message 2 后,从中可以获得SNonce,这是AP便集齐了计算PTK 所需的所有材料。这时AP会计算PTK,然后计算message 2 的MIC 并与 message 2 中的 MIC比较,若二者不一致,AP会丢弃掉message 2,不会做任何回复。在WPA2-personal中,如果输入了错误的密码,连接就会卡在这一步。
MIC 与 KCK
EAPOL 中的 MIC 用于确保EAPOL key frame没有被篡改。计算 MIC 需要一个key以及需要保护的数据作为输入。这个key便是KCK。计算MIC的算法与上文提到的HMAC-Hash 类似。计算MIC时有两点需要注意:
- 在计算EAPOL key frame的MIC是,输入到MAC算法中的frame body 的MIC 是初始化为零的。
- 有些EAPOL key frame中的Key Data field是加密的(例如message 3),对于这种frame计算MIC 时,先将Key Data进行加密,再通过MAC计算MIC。
在上面关于AKM的表格中我们可以看到,计算MIC的算法以及KCK的长度都是AKM 所决定的(Integrity algorithm)。
KEK 与 Key Data field
KEK用于加密 Key Data,KEK的长度以及加密算法由AKM决定(Key wrap algorithm)。
Cipher suite
cipher suite 直译为密码套件,可以对数据进行加密并生成MIC。在本文开头,我说cipher suite可以理解为一种算法,这是不太贴切的,因为cipher suite实际上拥有更丰富的内涵。cipher suite 规定了加密以及生成MIC所用的算法,同时也规定了用哪些材料作为这些算法的输入。CCMP 是常用的cipher suite,它的全称是 CTR with CBC-MAC protocol,将 cipher suite理解为一种协议确实更为贴切。下面就用CCMP介绍一下 cipher suite是如何工作的。
CCM 和 AES
AES 是一种加密算法,接受明文和密钥输出密文。
CCM 是一种工作模式,它可以利用AES 等块加密算法生成密文和认证标签。可以理解为AES 是原始的加密函数,CCM 调用AES 去实现更丰富的功能
特性 | 纯AES(如ECB/CBC) | AES-CCM |
---|---|---|
输出 | 仅密文 | 密文 + 认证标签 |
输入 | 明文 + 密钥 (+IV) | 明文 + 密钥 + Nonce + AAD + Tlen |
功能 | 仅加密 | 加密 + 认证 |
安全性 | 依赖模式(如ECB不安全) | 同时保障机密性和完整性 |
CCMP
CCMP工作流程如下图所示可以看到,TK参与了对数据的加密。