这学期我选了我校的公选课《无线网络安全技术》。以第二个实验为契机,我学习了一下802.11无线网络的安全。感觉网络上的中文资料太混乱、太不成体系。在这里,我用这些文章来系统地说一下这方面的东西。

首先,我们要先分清楚几个名词:WEP WPA WPA2 802.11 802.11i Wifi RSN RSNA

分清楚这几个东西不是很简单的事情。我们应该知道Wi-Fi是无线局域网的意思,而802.11也是无线局域网的标准,那么它们的区别是什么呢?

参考这本书 Real 802.11 Security: Wi-Fi Protected Access and 802.11i的说法:

In summary, Wi-Fi defines a subset of IEEE 802.11 with some extensions

而会出现这种情况的原因要归结于802.11协议比较开放,没有强制规定很多问题。这也就导致一个采用部分802.11特性的设备很可能不能和令一个采用部分802.11特性的设备通信。这很糟糕。为了解决这个问题,Wi-Fi联盟成立(当时叫做 Wireless Ethernet Compatibility Alliance ,WECA),它推出了Wi-Fi认证,并保证:两台通过Wi-Fi认证的设备可以通过无线网络相互通信。这样一来就解决了上面的问题。

那么,作为安全标准的WEP、WPA、WPA2和ieee 802.11i的关系是什么呢?首先来看WEP。参考维基百科的说法:

Introduced as part of the original 802.11 standard ratified in 1997, its intention was to provide data confidentiality comparable to that of a traditional wired network.

也就是说WEP是IEEE 802.11标准一开始就规定的安全标准。 WEP的意思是“有线等效加密”。

再来看WPA。WPA和Wi-Fi一样,也是Wi-Fi联盟的认证。和Wi-Fi不同的是,WPA是安全性认证。比较麻烦的是,WPA一开始并不是802.11某个部分的子集,它完全是Wi-Fi联盟设计的安全协议。这是为了避免厂家自行其是,从而产生安全上的不兼容问题。这一部分安全协议最终被标准化为802.11i,也就是今天我们要说的主角了。802.11i是对WPA协议的扩展与重构,Wi-Fi联盟使用WPA2作为新的认证商标,以说明这个产品支持802.11i标准。所以简单地说,WPA2应该被视作802.11i的实现。

虽然WPA3认证(对应802.11-2016)已经在2018年发布,但现今市面上绝大多数产品仍是WPA2认证的。下面的讨论也主要基于WPA2,也就是802.11i-2004和802.11-2007

最后来研究RSN和RSNA。RSN(robust security network)是“鲁棒安全网络”或者“健壮安全网络”的意思。RSN的字面意思很好懂,就是一个健壮的、安全的网络。802.11i引入这个概念来区分使用802.11i规定的、新的安全方法的网络和旧的WEP网络。它将WEP网络称为”pre-RSN”,也就是在RSN提出之前的网络,而将使用802.11i新引入的安全手段建立的网络称为RSN。所以建立RSN其实是使用802.11i安全的目的。

RSNA则是在两个使用802.11i安全套件的终端间建立的逻辑连接。或者用一个更常用的词“链路”。我们说的两个终端(比如说AP和STA)“连上了”,其实就是在这两个终端间建立了RSNA。

值得一提的是, 深入理解Android:Wi-Fi、NFC和GPS卷 这本书很不错,值得一读,但在RSNA的概念上犯了错误。原文如下:

RSNA(Robust Secure Network Association,强健安全网络联合)是802.11定义的一组保护无线网络安全的过程,是一套安全组合拳。这套组合拳包含的过程如图3-45所示。

RSNA的Association不是指802.11i各个组件的组合,而是指两个终端的连接。在NIST上查询RSNA这一词,定义很明确:

A logical connection between communicating IEEE 802.11 entities established through the IEEE 802.11i key management scheme, also known as the four-way handshake.

其实我们查询Association这个词也会发现,它有两个意思,这里应该取第二个:

1. (often in names) a group of people organized for a joint purpose.

2. a connection or cooperative link between people or organizations.

下面,我们就围绕两个终端如何建立RSNA这一主题,探索802.11i的世界。

首先,802.11i规定了建立RSNA的方法和建立RSNA后数据如何传输,整个过程可以用802.11i状态机表示:

</figure>

整个连接可以分为五个过程:

发现(Discovery)-> 认证(Authentication)-> 密钥生成与分发(Key Generation and Distribution) -> 加密数据传输(Protected Communication)-> 连接终止(Connection Termination)

其中相当于建立连接的前三个过程,是我们最感兴趣的过程。下面就来近距离观察这三个过程:

1.发现

AP会对外发送BEACON帧:

</figure>

这个帧是AP在对外广播自己的各种信息。见下:

</figure>

我们感兴趣的当然是RSN Information:

</figure>

这个结构说明了自己支持的加密方法、认证方法等。

STA捕获了这个帧,就可以知道环境中无线网络的信息。如果要求某个AP提供信息,可以用Probe request帧:

</figure>

在Probe response帧中,AP回答自己的各种信息。

在知道AP的信息后就可以连接了。第一个发送的帧应该是Authentication:

</figure>

聪明的同学可能会问,这里的Authentication不是“认证”的意思吗?而认证不是下一步要做的事情吗?其实这个认证,叫做Open System Authentication,或者叫做Null Authentication. 从第二个名字就可以知道它什么也不做,那为什么还是要进行这个过程呢?前面说过,WEP是802.11协议的一部分,有了新的WPA,不能直接剔除掉WEP的过程。这个帧正是WEP的认证,在RSNA建立的过程中使用这个帧是为了和WEP,更准确地说是和802.11状态机兼容。这也体现了开闭原则,在添加新功能时,不能修改原有的体系。

下一步是Association request and response,在这个过程中,STA发送association request,选择自己想采用的各种连接参数(其中包括认证和加密方式),AP发送association response, 确认STA的选择有效。

(不知道为什么,我没有捕获到AP发送的association response)

</figure>

2.认证

在介绍这个过程之前,我们首先需要知道802.11i使用的两种认证方法。一种是预共享密钥(Pre Shared Key, PSK)认证,另一种是802.1x EAP(Extensible Authentication Protocol )认证。PSK就是我们常见的那种一个密码的情况,EAP则是公共网络(比如我校的SYSU-SECURE)常用的认证方式。

预共享密钥认证只认证双方对PSK的所有权,而不认证任何其他内容,这个所有权认证通过下面的4-Way Handshake进行;而EAP则要具体协议具体分析。

第二个过程·认证 分为两种情况,如果采用的是802.1x EAP套件,那么在这一步用EAP协议进行认证。关于EAP协议的情况我会在下一篇文章中涉及。如果采用的是PSK,则直接跳过这个过程

3. 密钥生成与分发( 4-WAY HANSHAKE )

这一步就是传说中的四次握手了。这个过程主要有两个目的:

1.验证上一步认证的效果–AP和STA是否都对PMK有了所有权。

2.在AP和STA上安装密钥,以便下面加密通信。

(这个过程还可能会有Group Key的生成与分发,但一般用不到,这里不表)

首先先要解释PMK是什么。PMK(Pairwise Master Key)在下面会被用于密钥派生,它的产生分为两种情况:1.如果是PSK模式,PMK就是PSK。2.如果是802.1x EAP模式,它会在EAP协议过程中被安装在AP和STA中。

这样看,PMK是一个相对不变的参数。如果加密时直接使用PMK,那么安全性是很成问题的(据说tls1.1就有这个问题)。所以我们要使用PRF扩展密钥,生成一个暂时的密钥,也就是PTK( Pairwise Transient Key ):

PTK = PRF-X(PMK, “Pairwise key expansion”,Min(AA,SPA) || Max(AA,SPA) ||Min(ANonce,SNonce) ||Max(ANonce,SNonce))

其中X指长度,可以是384(CCMP)或者512(TKIP).Nonce在这里指随机数,SNONCE指STA的随机数,ANONCE指客户端的随机数。AA指AP的MAC地址,SA指STA的MAC地址。

TIPS: CCMP是采用AES CCM(一种计数器模式)的加密方法,TKIP是采用RC4的加密方法,在802.11i中只支持这两种加密。

这里的SNONCE和ANONCE显然是这一次连接时产生的,那么应该要有某种形式的交换。第一帧就是AP向STA发送自己的随机数:

</figure>

拿到这个随机数以后,客户端就可以生成一个随机数,然后开始计算PTK。PTK算出来后会被分为3个部分:

</figure>

其中TK就是加密通信所用的密钥,KCK是下面计算MIC要用到的,KEK是用来加密某些信息的(这里并不深究KEK到底用来做什么,请自行查阅相关资料)。

之后,客户端会构造将自己的随机数写入第二帧,并且将MIC算出来后写入第二帧。MIC是怎么算出来的呢?其实MIC是一个消息校验码,相当于一个HASH函数,但这里用的是HMAC,用我们前面说过的KCK作为HMAC的key,用本帧的所有字节作为输入,计算出来的结果就是MIC。但这里有个问题,MIC不可能在计算出来之前就被填入本帧,所以在计算MIC的时候,要将本帧的MIC字段全部置为0.

第二帧的MIC用这个方式计算:

MIC = MIC(KCK, EAPOL)

AP在收到第二帧后,用相同的方法计算PTK和MIC,再与第二帧时STA传的MIC进行对比,就可以验证STA对PSK的所有权了。

那么,客户端又是如何验证服务端对AP的所有权的呢?其实也是通过MIC的。因为要计算出正确的MIC,就必须要有正确的KCK,只要这一帧的内容和上一帧不一样就可以了!

而这内容肯定是和上一帧不一样的,因为这一帧的NONCE字段被设置为了:

Key Nonce = ANonce

STA只需要计算一下MIC,就可以验证AP对PMK的所有权了。验证成功后,发送第四帧,整个4-WAY-HANDSHAKE握手过程就结束了。

下面的数据就会使用CCMP或TKIP加密,是比较安全的。

总的来说,建立RSNA的过程不是很复杂,也有比较好的扩展性。下一篇文章中我们将会讨论关于EAP的内容。