1、WAPI-PSK 认证过程一、 安全关联的建立STA 通过被动侦听信标帧或主动探询获得 AP 的安全策略。如果 AP 使用的是 WAI 证书鉴别和密钥管理机制,AP 发送鉴别激活分组启动证书鉴别过程,证书鉴别过程成功结束后,AP 和 STA 进行单播密钥协商过程和组播密钥通告过程。如果 AP 使用的是预共享密钥机制,AP 和 STA 直接进行单播密钥协商过程和组播密钥通告过程。STA 和 AP 之间的单播数据利用单播密钥协商过程所协商推导出的单播加密密钥、单播完整性校验密钥进行保护;AP 利用自己通告的组播密钥保护发送广播/组播数据,STA接收时采用 AP 通告的组播密钥进行解密。二、 WAP
2、I 信息元素WAPI 信息元素包含鉴别和保密套件选项,见图 5。所有的实现 WAPI 的 STA 应支持该信息元素。WAPI 信息元素的长度应最大为 255 八位位组。WAPI 信息元素格式元素标识 ID 应为 68。长度字段标识 WAPI 信息元素中除元素标识 ID 和长度字段以外的字段的八位位组数。版本字段标识 WAPI 协议的版本号,本规范中版本号为 1,其他值保留。鉴别和密钥管理(AKM)套件计数字段标识 STA 支持的鉴别和密钥管理机制个数。鉴别和密钥管理(AKM)套件字段包含 STA 支持的鉴别和密钥管理机制,m 为鉴别和密钥管理套件计数字段的值。单播密码套件计数字段标识 STA
3、支持的单播密码算法个数。单播密码套件字段包含 STA 支持的单播密码算法,n 为单播密码套件计数字段的值。组播密码套件字段包含 STA 支持的组播密码算法。WAPI 能力信息WAPI 能力信息字段表示请求或声明的能力信息,该字段长度为 2 个八位位组,各比特定义如下:WAPI 能力信息比特 0 为预鉴别标识。AP 如果支持预鉴别,设置此字段值为 1,否则设置为 0。非AP 的 STA 设置此字段值为 0。BKID 计数和列表字段。BKID 计数和列表字段仅用于发往 AP 的关联或重新关联请求帧中。BKID 计数字段表示 BKID 列表字段中包含的 BKID 的个数。BKID 列表字段包含 0
4、个或多个 STA 当前缓存的和目的AP 之间的有效的 BKID,s 为 BKID 计数字段的值。其中 BKID 可能为:a) STA 缓存的通过和目的 AP 预鉴别得到的 BKID;b) STA 缓存的通过证书鉴别得到的 BKID;c) STA 缓存的通过预共享密钥得到的 BKID。三、 实现方式在 BSS 中基于共享密钥(在 STA 和 AP 之间)的方式1) STA 通过 AP 的信标帧或探询响应帧识别 AP 支持 WAI 鉴别及密钥管理套件;2) STA 和 AP 之间进行链路验证;3) 在关联过程中,STA 在关联请求中包含 WAPI 信息元素确定选择的密码套件;4) 预共享密钥导出
5、BK 后,STA 和 AP 进行单播密钥协商过程、组播密钥通告过程;5) 把协商出来的密钥和密码套件通知 WPI 模块,进行数据传输保护。四、 单播密钥协商过程单播密钥协商过程使用基密钥完成单播会话密钥的协商,建立 USKSA(单播会话密钥安全关联) 。单播密钥协商过程单播密钥协商请求分组数据字段格式如下:单播密钥协商请求分组数据字段格式其中:标识 FLAG 字段长度为 1 个八位位组,定义如前,比特 4(USK 更新标识)有意义。当 AE 进行会话密钥更新时,比特 4 (USK 更新标识)的值为 1;否则为 0。BKID 字段长度为 16 个八位位组,表示当前作为共享密钥的基密钥,其值计算如
6、前定义。USKID 字段长度为 1 个八位位组,其中比特 0 标识当前协商的单播会话密钥,其他位保留。本字段的比特 0 在 BKSA 建立后第一次单播密钥协商时初值为,以后再重新进行单播密钥协商时该位在 0 和 1 之间翻转。ADDID 字段长度为 12 个八位位组,如前定义。MAC 地址 1 为 AE 的 MAC 地址,其中 MAC 地址 2 为 ASUE 的 MAC 地址。AE 挑战字段长度为 32 个八位位组,记作 N1。若标识字段的比特 4 (USK 更新标识)的值为 0,则 AE 的挑战为 AE 产生的随机数;若标识字段的比特 4 (USK 更新标识)的值为 1,则 AE 挑战为上一
7、次单播密钥协商过程所协商的值。在 AE 完成证书鉴别过程并建立有效的 BKSA 后,或采用预共享密钥鉴别方式时,或缓存的 BKSA 被使用,或进行单播密钥更新时,AE 向 ASUE 发送单播密钥协商请求分组开始与 ASUE 进行单播密钥协商。ASUE 接收到与其相关联的 AE 发送的单播密钥协商请求分组后,进行如下处理:a) 首先检查 BKID 所指 BKSA 是否有效,若无效,则丢弃该分组;否则检查标识字段的比特 4(USK 更新标识)是否为 0,若是 0,执行 c)操作;若是 1,则检查 USKID 所指的 USKSA 是否有效,若有效,则丢弃该分组;否则,执行 b)操作;b) 检查 AE
8、 挑战与本地保存的值是否相同,若不同,则丢弃该分组;否则,执行 c)操作。c) ASUE 利用随机数产生器产生 ASUE 挑战 N2,然后计算 KD-HMAC-SHA256(BK ,ADDID|N1|N2|“pairwise key expansion for unicast and additional keys and nonce”) ,其中N1 为 AE 挑战,N2 为 ASUE 挑战。生成 96 个八位位组,前 64 个八位位组为单播会话密钥(第一个 16 个八位位组为单播加密密钥,第二个 16 个八位位组为单播完整性校验密钥,第三个 16 个八位位组为 WAI 协议消息鉴别密钥,第四
9、个 16 个八位位组为组播密钥/站间密钥加密密钥) 。最后 32 个八位位组为下一次单播会话密钥协商过程的 AE 挑战的种子,然后对该种子使用 SHA-256 函数计算得到长度为 32 个八位位组的下一次单播密钥协商过程的 AE 挑战并保存。d) 用 WAI 协议消息鉴别密钥通过 HMAC-SHA256 算法本地计算消息鉴别码,构造单播密钥协商响应分组发往 AE。e) 若为 BSS 模式,则 ASUE 利用原语 MLME-SETWPIKEYS.request 安装新协商的单播会话密钥;若为 IBSS 模式,只有当 AE 的 MAC 地址大于 ASUE 的 MAC 地址时,ASUE 才利用原语
10、MLME-SETWPIKEYS.request 安装新协商的单播会话密钥。对于新安装的密钥,ASUE 调用原语 MLME-SETPROTECTION.request 仅启用其接收功能,即允许用其解密 AE 发来的单播数据。单播密钥协商响应分组数据字段格式如下:单播密钥协商响应分组数据字段格式其中:标识 FLAG 字段长度为 1 个八位位组,定义如前,比特 4(USK 更新标识)有意义。当 AE 进行会话密钥更新时,比特 4 (USK 更新标识)的值为 1;否则为 0。BKID 字段长度为 16 个八位位组,表示当前共享的基密钥,其值计算如前定义。USKID 字段长度为 1 个八位位组,其中比特
11、 0 标识当前协商的单播会话密钥,其他位保留。本字段的比特 0 初始值为 0,每次重新进行单播密钥协商时该位在 0 和 1 之间翻转。ADDID 字段长度为 12 个八位位组,如前定义。MAC 地址 1 为 AE 的 MAC 地址,其中 MAC 地址 2 为 ASUE 的 MAC 地址。AE 挑战字段长度为 32 个八位位组。若 ASUE 发起密钥更新,ASUE 设置标识字段的比特 4(USK 更新标识)的值为 1,AE 挑战字段为上一次单播密钥协商过程所协商的值;否则该字段和单播密钥协商请求分组中的 AE 挑战字段相同。ASUE 挑战字段长度为 32 个八位位组。由 ASUE 利用随机数产生
12、器生成。WIEASUE 字段为 ASUE 选择的 WAPI 信息元素。在 BSS 模式下,该字段和ASUE 在关联请求帧中发送的 WAPI 信息元素相同;在 IBSS 模式下,该字段包含 ASUE 选择的单播密码算法、AE 通告的组播密码算法和当前使用的鉴别和密钥管理套件列表。消息鉴别码字段长度为 20 个八位位组。其值为 ASUE 利用最新协商的消息鉴别密钥通过 HMAC-SHA256 算法对本字段之前的所有协议数据字段内容计算得到,不包含分组头。ASUE 进行密钥更新时,或收到 AE 的单播密钥协商请求分组并构造单播密钥协商响应后,发送单播密钥协商响应分组给 AE。AE 收到单播密钥协商响
13、应分组后,进行如下处理:a) 若标识字段的比特 4(USK 更新标识)为 1,执行 b)操作;否则执行 c)操作。b) 若当前有有效的 USKSA 并且 USKID 所指 USKSA 无效,则执行 c)操作;否则,丢弃该分组。c) 检查 AE 挑战值是否正确,若不正确,则丢弃该分组;否则,执行 d)操作。d) 计算 KD-HMAC-SHA256(BK,ADDID| N1|N2|“pairwise key expansion for unicast and additional keys and nonce”) ,其中 N1 是 AE 挑战,N2 是 ASUE 挑战。生成96 个八位位组,前 6
14、4 个八位位组为单播会话密钥(第一个 16 个八位位组为单播加密密钥,第二个 16 个八位位组为单播完整性校验密钥,第三个 16 个八位位组为 WAI 协议消息鉴别密钥,第四个 16 个八位位组为组播密钥 /站间密钥加密密钥) 。后 32 个八位位组为下一次单播会话密钥协商过程的 AE 挑战的种子,然后对种子使用 SHA-256 函数计算得到长度为 32 个八位位组的下一次单播会话密钥协商过程的 AE 挑战。利用消息鉴别密钥通过 HMAC-SHA256 算法本地计算消息鉴别码,与分组中的消息鉴别码字段值比较,若相同,则执行操作 e) ;否则,丢弃该分组。e) 若标识字段的比特 4(USK 更新
15、标识)为 0,在基础模式下,则检查 WIEASUE 字段和自己收到的关联请求帧的 WAPI 信息元素是否相同,若不同,解除与 STAASUE 的链路验证;若相同,则执行操作 f) ;在 IBSS 模式下,检查 WIEASUE 字段中选择的单播密钥算法是被支持的,然后执行操作 f) ;否则解除与 ASUE 的链路验证;若标识字段的比特 4(USK 更新标识)为 1,则执行操作 f) 。f) 用 WAI 协议消息鉴别密钥通过 HMAC-SHA256 算法本地计算消息鉴别码,构造单播密钥协商确认分组,发送给 ASUE。g) 若为 BSS 模式,则 AE 利用原语 MLME-SETWPIKEYS.re
16、quest 安装新协商的单播会话密钥;若为 IBSS 模式,只有当 AE 的 MAC 地址大于 ASUE 的 MAC 地址时,AE 才利用原语 MLME-SETWPIKEYS.request 安装新协商的单播会话密钥。对于新安装的密钥,AE 调用原语 MLME-SETPROTECTION.request 启用其收发功能,即可利用其对单播数据进行加解密。若此次单播密钥协商过程为更新过程,则一旦使用新密钥正确解密过数据时,删除旧的单播会话密钥;或者启用新密钥收发数据 60 秒之后,自动删除旧的单播密钥。单播密钥协商确认分组数据字段格式如下:单播密钥协商确认分组数据字段格式其中:标识 FLAG 字段
17、长度为 1 个八位位组,定义如前,本字段和单播密钥协商响应分组的标识字段相同。BKID 字段长度为 16 个八位位组,本字段和单播密钥协商响应分组的 BKID 字段相同。USKID 字段长度为 1 个八位位组,其中比特 0 标识当前协商的单播密钥,其他位保留。本字段和单播密钥协商响应分组的 USKID 字段相同。ADDID 字段长度为 12 个八位位组,本字段和单播密钥协商响应分组的 ADDID 字段相同。ASUE 挑战字段长度为 32 个八位位组。本字段和单播密钥协商响应分组中的ASUE 挑战字段相同;WIEAE 字段为 AE 在信标帧和探询响应帧中发送的 WAPI 信息元素。消息鉴别码字段
18、长度为 20 个八位位组。其值为 AE 利用最新协商的消息鉴别密钥通过 HMAC-SHA256 算法对本字段之前的所有协议数据字段内容计算得到,不包含分组头。AE 收到单播密钥响应分组后,发送单播密钥协商确认分组给 ASUE。ASUE 接收到 AE 的单播密钥协商确认分组后,进行如下处理:a) 检查 ASUE 挑战与自己在单播密钥协商响应分组中发送的值是否相同,若不同,则丢弃该分组;否则,执行 b)操作。b) 利用消息鉴别密钥通过 HMAC-SHA256 算法本地计算消息鉴别码,与分组中的消息鉴别码字段值比较,若相同,则执行操作 c) ;否则,丢弃该分组。c) 若标识字段的比特 4(USK 更
19、新标识)为 0,则检查 WIEAE 字段和自己收到的信标帧和探询响应帧的 WAPI 信息元素是否相同,若相同,则执行操作 d) ;否则,解除与 STAAE 的链路验证。若标识字段的比特 4(USK 更新标识)为 1,则执行操作 d) 。d) 调用原语 MLME-SETPROTECTION.request 启用新安装的单播会话密钥的发送功能,即允许利用该新密钥加密发送单播数据。若此次单播密钥协商过程为更新过程,则还需删除旧的单播会话密钥。五、 组播密钥/站间密钥通告过程组播密钥/站间密钥通告过程使用单播密钥协商过程协商出来的密钥进行组播密钥/ 站间密钥通告,并建立 MSKSA 或 STAKeyS
20、A。组播密钥/站间密钥通告过程组播密钥/站间密钥通告分组:单播密钥协商成功后,或 AE 要更新组播密钥时,或 AE 收到 STAKey 建立请求分组时,AE 向 ASUE 发送组播密钥 /站间密钥通告分组通告组播/站间主密钥。组播密钥/站间密钥通告分组数据字段格式如下:组播密钥/站间密钥通告分组数据字段格式其中:标识 FLAG 字段长度为 1 个八位位组,定义如前,比特 5、6 有意义。当 AE 通告的密钥是 STAKey 时,比特 5(STAKey 协商标识)为 1;否则为 0。比特6(STAKey 密钥删除标识)为 1 表示删除由 USKID 和 ADDID 所确定的 STAKey,否则为
21、 0。MSKID/ STAKeyID 字段长度为 1 个八位位组,其中比特 0 标识当前通告的密钥,其他位保留。本字段中比特 0 初始值为 0,每次更新通告密钥时,该位在 0 和 1 之间翻转。USKID 字段长度为 1 个八位位组,其中比特 0 标识计算消息鉴别码字段值所用的消息鉴别密钥。ADDID 字段长度为 12 个八位位组。当通告的密钥是 STAKey 时,该字段的值为发起方的 MAC 地址|对端的 MAC 地址;当通告的密钥为组播密钥时,该字段的值为MACAE|MACASUE。数据序号字段长度为 16 个八位位组,表示一个整数,用于标识已经使用当前通告的密钥加密发送的数据分组序号(W
22、PI 组播数据分组中的 PN) ,之后 STA 收到的数据帧序号应大于本字段值,否则丢弃。 密钥通告标识字段长度为 16 个八位位组, 表示一个整数, 初始值为0x5C365C365C365C365C365C365C365C36,在每次密钥更新通告时该字段值加 1。若通告的密钥不变,则本字段值保持不变。AE 端判断密钥通告标识字段值单调递增溢出后,与所有已关联的 STA 解除链路验证。该字段还用作密钥通告数据的 IV。密钥数据字段格式如前定义,其内容字段是 AE 利用密钥加密密钥采用协商选择的单播密码算法对通告主密钥加密(不带 MIC)后的密文,通告主密钥为 AE 生成的 16 个八位位组的随
23、机数,加密所用的 IV 为密钥通告标识字段。消息鉴别码字段长度为 20 个八位位组。其值为 AE 利用 USKID 字段标识的消息鉴别密钥通过 HMAC-SHA256 算法对本字段之前的所有协议数据字段内容计算得到,不包含分组头。ASUE 接收到 AE 发送的组播密钥/ 站间密钥通告分组后,进行如下处理:a) 若标识字段的比特 5(STAKey 协商标识)为 1,则为站间密钥通告;否则为组播密钥通告。若 ASUE 不支持或不允许 STAKey 使用,则当标识字段的比特 5(STAKey 协商标识)为 1 时,丢弃该分组。ASUE 利用 USKID 字段标识的消息鉴别密钥计算校验值,与消息鉴别码
24、字段值进行比较,若不同,则丢弃该分组;否则执行 b)操作。b) 检查密钥通告标识字段值是否单调递增,若为单调递增,则执行 c)操作;否则丢弃该分组。c) 对密钥数据解密得到 16 个八位位组的通告主密钥,利用 KD-HMAC-SHA256 算法进行扩展,则生成长度为 32 个八位位组的会话密钥(其中前 16 个八位位组为加密密钥,后 16 个八位位组为完整性校验密钥) 。若标识字段的比特 5(STAKey 协商标识)为 1,则上述密钥为站间密钥;否则为组播密钥。d) 保存密钥通告标识字段值,生成组播密钥/站间密钥响应分组,发送给 AE。e)安装或删除密钥。若此次为组播密钥通告过程,则利用原语
25、MLME-SETWPIKEYS.request 安装新的组播会话密钥,并调用原语 MLME-SETPROTECTION.request 启用其接收功能;若此次组播密钥通告过程为 BKSA 建立后的首次通告过程,则将受控端口的状态设置为 on;若此次组播密钥通告过程为更新过程,则一旦使用此新密钥正确解密过数据时,删除旧的组播密钥。若此次为站间密钥通告过程,对于站间密钥的发起方而言, 利用原语 MLME-SETWPIKEYS.request 安装新的站间密钥,并调用原语 MLME-SETPROTECTION.request 启用其发送功能,若此次站间密钥通告过程为更新过程,则删除旧密钥;对于站间密
26、钥的对端而言, 安装新的站间密钥,并启用其接收功能, 若此次站间密钥通告过程为更新过程,则一旦使用新密钥正确解密过数据时, 删除旧的站间密钥。若此次为站间密钥删除过程,对于站间密钥的对端而言, 删除新安装的站间密钥。若 AE 通告了新的组播密钥, ASUE 保存组播密钥,在接收组播数据帧时根据KeyID 字段选择组播解密密钥,当 ASUE 接收到 AE 用最新通告的组播密钥加密的组播数据帧,并且校验和解密均正确时,丢弃旧的组播密钥。组播密钥/站间密钥响应分组:组播密钥/站间密钥响应分组数据字段格式如下:组播密钥/站间密钥响应分组数据字段格式其中:标识字段长度为 1 个八位位组,定义如前,此字段
27、值应与 AE 发送的组播密钥/ 站间密钥通告分组中的标识字段值相同。MSKID/ STAKeyID 字段长度为个八位位组,值为 AE 发送的组播密钥/ 站间密钥通告分组中的 MSKID/ STAKeyID 字段值。USKID 字段长度为 1 个八位位组,其中比特 0 标识计算消息鉴别码字段值所用的消息鉴别密钥。此字段值应与 AE 发送的组播密钥/站间密钥通告分组中的 USKID 字段值相同。ADDID 字段长度为 12 个八位位组,该字段的值和组播密钥 /站间密钥通告分组中ADDID 字段值相同。密钥通告标识字段长度为 16 个八位位组,表示一个整数,取值为 AE 发送的组播密钥/站间密钥通告
28、分组中的密钥通告标识字段值。消息鉴别码字段长度为 20 个八位位组。其值为 ASUE 利用 USKID 字段标识的消息鉴别密钥通过 HMAC-SHA256 算法对本字段之前的所有协议数据字段内容计算得到,不包含分组头。ASUE 向 AE 发送组播密钥/站间密钥响应分组,AE 接收到 ASUE 发送的组播密钥响应分组后,进行如下处理:a) 利用 USKID 字段标识的消息鉴别密钥计算校验值,与消息鉴别码字段值进行比较,若不同,则丢弃该分组;否则,执行 b)操作。b) 比较标识、MSKID/STAKeyID 字段、USKID 字段、ADDID 字段和密钥通告标识字段与发送的组播密钥/站间密钥通告分
29、组中的相应字段值,若均相同,则本次组播密钥/ 站间密钥通告成功;否则,丢弃该分组。C) 通告成功后,若此次通告的密钥尚未安装,则利用原语 MLME-SETWPIKEYS.request 安装新密钥。若此次密钥通告过程为组播密钥通告,则 AE 调用原语 MLME-SETPROTECTION.request 启动新密钥的发送功能,即利用此密钥加密组播数据;若此次组播密钥通告过程为 BKSA 建立后的首次通告过程,则将受控端口的状态设置为 on;若此次组播密钥通告过程为更新过程且已通告给所有已关联的 ASUE,则删除旧密钥。若此次密钥通告过程为向站间密钥发起方的通告,则 AE 对于站间密钥的发起方至对端的单播数据时,直接转发,不需进行解密、加密。AE 在更新组播密钥过程中,使用旧的组播密钥对组播数据帧进行加密发送,当对所有已关联到该 AP 的 STA 均组播密钥通告后,才启用最新通告的组播密钥用于组播数据帧的加密发送。六、 完成开始加密传输七、 抓包说明:1-4 号:侦测包5-9 号:普通链路验证包10-20 号:关联请求与响应,其中 12 号为单播密钥协商请求;13 号单播密钥协商响应;16 号单播密钥协商确认;18 号组播密钥/站间密钥通告;19 号组播密钥/ 站间密钥响应。21 号开始数据加密传输。