蓝牙的安全管理分为control端也就是LL层的安全管理和host端的安全管理, LL层的安全机制主要包括白名单管理,私有可解析地址管理,以及SM管理中的链路加解密等。host端的安全管理主要是SM层的管理,包括配对、绑定、鉴权、加密等流程的管理。本章主要介绍host端的SM管理
SM层简介
SM层是为了在两个蓝牙设备之间建立一个安全可靠的数据传输通道, 主要的流程包括配对,绑定、鉴权、加密、消息完整性校验。
配对:在两个设备之间创建一个或多个共享密钥的过程
绑定:每一端保存配对中创建的密钥的行为,用于后续的连接,形成一个信任的设备对,绑定后的设备可以直接回连,而不用再走配对的流程。
设备鉴权:根据两端设备的输入、输出能力和鉴权需求,选择不同的鉴权方式,验证两个设备有相同的密钥
加密:对设备之间交换的数据进行加密的过程,用来保证数据链路的安全。
消息完整性:对数据进行签名,并在另一端验证签名的过程。
配对流程简介
配对是为了建立密钥,密钥用来加密连接,发布密钥是为了共享密钥,用于加密重新连接、验证签名和随机地址解析,上图是蓝牙配对的整个流程图。
配对有三个阶段,两个阶段是必须使用的,第三阶段可选:
阶段一:Pairing Feature Exchange 交换配对特性
阶段二:(LE legacy pairing): Short Term Key (STK) Generation 传统配对方式,生成STK
阶段二:(LE Secure Connections): Long Term Key (LTK) Generation 安全配对方式, 生成LTK
阶段三:Transport Specific Key Distribution 发布密钥
上图中左边的initiator代表发起配对的一端,通常代表手机, 右边的responder代表响应配对请求的一端,通常代表设备端。
配对阶段一
在双方建立连接之后,设备端可能会发起security request请求,这个数据包是可选的,主机端收到这个数据后,如果密钥已经存在则加密或刷新密钥,如果没有密钥初始化配对流程,当然也可能拒绝,这个在后面会详细讲解。
Master端会发送配对请求 Pairing_Request命令,Slaver端收到后会回复配对响应包Pairing_Response的命令,当然如果设备不支持配对,则会返回“Pairing Not Supported”错误码 。这两条命令是让双方会交换自身的IO能力和鉴权需求,以及需要传输的密钥,例如是否支持输入,是否支持显示,是否需要防止中间人攻击,是否支持安全配对,是否支持OOB,是否需要下发LTK等等,通过这些来决定在配对阶段二的时候选择哪种配对和鉴权方法,以及配对阶段三下发和生成哪些密钥。
本章节主要来剖析阶段一中配对请求数据包中的每个字段的含义以及使用。
下面看下Pairing_Request数据包的内容
- Code: 数据包命令字, 0x01代表配对请求,0x02代表配对响应包
- IO能力:表示设备的输入和输出能力,具体数值如下图:
- OOB数据标志位:表示是否支持使用外部通信方式来交换配对过程中使用的一些信息。0x00表示不支持OOB,0x01表示支持OOB
- AuthReq:鉴权请求 表示设备是否需要绑定,是否需要支持防止中间人攻击,是否支持安全配对等
- **BF**字段是binding flag的缩写,表示设备是否支持绑定
绑定是在配对发生后交换长期密钥,并存储这些密钥以供以后使用——它是在设备之间创建永久安全性。配对是允许发生结合的机制。该字段为0x00表示不支持绑定,0x01表示支持绑定。
- **MITM** 是“中间人”的缩写。如果设备请求 MITM 保护,则该标志设置为1,否则置0。
- **SC** 字段是secure connect的缩写,表示安全配对,设置为 1 以请求 LE 安全连接配对。可能产生的配对机制是,如果两个设备都支持 LE 安全连接,则使用 LE 安全连接,否则使用 LE 传统配对。所以这个标志是确定第 2 阶段配对方法的指标。
- **KP**字段是keypress,仅在 Passkey Entry 协议中使用,在其他协议中被忽略。Passkey Entry 协议是 Legacy Pairing 和 Secure Connection 的典型配对方法。
- Maximum Encryption Key Size 设备支持的最大加密密钥大小,大小在7 - 16个字节
- Initiator Key Distribution 发起者密钥分配,该字段决定了在配对阶段三中需要下发的密钥有哪些,例如LTK,IRK,CSRK,EDIV and Rand等等,这些密钥的含义和使用会在下章节介绍。
具体该字段的含义如下:
- **Enckey**: 该字段表示是否需要生成LTK。
1. 在传统配对中,0x01表示会下发LTK用于链路的加密, 0x00表示不会下发LTK,
2. 在安全配对LESC中,由于在配对阶段二就会生成LTK,所以该字段会被忽略。
3. 而在传统蓝牙中,该字段表示是否需要通过经典蓝牙的Linkey来得到LTK。
- **idKey**: 表示是否下发IRK,IRK是用来解析私有可解析地址的。0x01表示需要下发IRK,0x00表示不需要下发IRK。
- **SignKey**: 表示是否需要下发CSRK,0x01表示需要下发CSRK,0x00表示不需要下发CSRK。
- **LinkKey**:表示是否需要通过LTK来生成经典蓝牙需要的LinkKey,这个能力需要支持安全配对LESC才可以,如果Initiator和Responder两端设备都支持LESC,并且该字段都置1,则会生成LinkKey。 如果设备不支持安全配对,则该字段需要置0,并且会被忽略。
- Responder Key Distribution 响应者密钥分配,格式与上面发起者密钥分配相同,不再次介绍了。
BLE的SM常用密钥介绍
常用的密钥定义简单介绍下,具体的使用会在后面章节详细介绍。
- Identity Resolving Key (IRK):用于生成和解析私有解析地址用的,IRK的生成有很多可选方式,并不固定,而且其Key Size也不规定为7-16 bytes。一个Master从Slave那里得到Slave的IRK,就可以解析Slave的random address;一个Slave从Master那里得到Master的IRK,就可以解析Master的random address了。
- Connection Signature Resolving Key (CSRK):用于对数据进行签名已经验证签名数据,CSRK的生成也有很多可选方式,并不固定,而且其Key Size也不规定为7-16 bytes。一个设备得到另一个设备的CSRK后,就可以对从另一个设备那接收到的数据进行签名验证了。
- Long Term Key (LTK):加密链路用,后面用来传输数据的session key就是通过LTK生成的,传统配对是在阶段三通过STK生成的LTK,安全配对是在阶段二生成的LTK。
Encrypted Diversifier (EDIV):在LE legacy pairing过程中,用于识别LTK分发;
Random Number (Rand):在LE legacy pairing过程中,用于识别LTK分发。
以上就是配对请求包Piaring Request请求包内容的分析,配对响应包pairing Responses数据包与请求包内容几乎一样,就不另行分析了。
Initiator和Responder双方交换完自己的IO能力后,接下来就是根据上面交换的配对信息,选择不同的配对方式和鉴权方式,这些就是配对阶段二需要做的工作。
配对鉴权简介
在详细剖析阶段二流程之前,先介绍下配对和鉴权的常用方式。
鉴权方式:
- Just works 不鉴权 不需要用户来参与,这种方式不能防止中间人攻击。
- Numeric Comparison 这种方式是需要两个设备格子生成6个数据,并显示出来,用户比较两个设备上的数字后,进行确认。这种鉴权方式是蓝牙4.2后才支持的,需要设备双方需要都支持安全配对(LESC),并且设备至少需要有显示6位数字的能力和输出yes or no的能力。
Passkey Entry 这种方式是由两端设备分别输入配对码的方式进行鉴权的,这种也是蓝牙最早最传统的一种鉴权方式,有两种操作方法:
- 两个设备都有输入能力,用户分别在两个设备上输入相同的6个数字,接下来的配对过程会分别校验对端设备的输入来鉴权设备。
- 一个设备随机生成并显示6位数字,用户记下这个数字后,在另一个设备上输入相同的数字,此时SMP协议会将输入的数字传输给对端,来校验数字是否正确,以达到鉴权的目的。
- Out Of Band (OOB) OOB方式是通过外部的其他方式来进行鉴权,例如通过NFC,二维码或者WIFI之类的来鉴权。
配对方式:
配对方式主要有传统配对legacy pairing,和安全配对secure pairing。安全配对方式是蓝牙4.2后支持的配对方式,上面的Numeric Comparison鉴权方式也必须依赖于安全配对。
传统配对legacy pairing和安全配对secure pairing的比较:
legacy pairing(传统配对) | secure pairing(安全配对) | |
---|---|---|
生成密钥不同 | 生成两个密钥TK和STK | 生成一个密钥LTK |
鉴权模式 | 不支持Numeric Comparison模式 | 支持Numeric Comparison模式 |
窃听者攻击 | 配对过程不能防止窃听者攻击 | 配对过程可以防止窃听者攻击 |
OOB模式 | 双方都支持获取到对方的OOB信息后,才可以使用OOB模式 | 至少有一方获取到对方的OOB信息后,就可以使用OOB模式 |
传统配对方式中主要生成TK和STK:
Temporary Key (TK):一个 128-bit的临时密钥,用来生成STK, 例如在Passkey Entry模式中,输入的数字即可近似认为是TK。
STK:一个 128-bit的临时密钥,用来加密接下来的配对流
安全配对生成LTK:
Long Term Key (LTK):一个128_bit的密钥用来加密配对数据流和后续的连接。
传统配对不能防止窃听者攻击,因为他使用的是AES对称加密算法。对称加密算法AES的介绍可以看下我另一篇博客对称加密算法。
安全配对可以防止窃听者攻击,因为它使用的是ECDH非对称加密算法。非对称加密算法ECDH的介绍可以看下我另一篇博客非对称加密算法。
鉴权模式选择
鉴权模式的选择就是根据配对阶段一中设备双方交换了各自的配对信息来决定的,优先级为OOB > MITM > IO能力
如果支持OOB则使用OOB模式,否则会检查MITM标志位,看是否需要防止中间人攻击,最后才会看双方的IO能力。如下图:
通过上面两图的差异,也可以看出传统配对是双方都支持OOB才可以使用OOB模式,安全配对模式则是只要其中的一方支持OOB,就可以使用OOB模式。
上图便是蓝牙双方能力映射图,通过这个双方就可以协商使用合适的配对方法来完成配对。
在选择好了合适的配对和鉴权方式后,接下来就是BLE配对的阶段二 ,在该阶段会通过配对流程生成STK或者LTK,该阶段不同的配对和鉴权方式导致情况较多,会专门在下章节详细介绍。