配对是找到并确定需要和自己通信的设备,也就是身份确定,而这一过程仅仅是由启动加密到得到短期秘钥(STK)为止; 而绑定是将长期秘钥(LTK)、 身份解析秘钥(IRK)和连接签名解析秘钥(CSRK)这 3 个密钥中的某个或者组合进行交换后,将交换的这些密钥存储到数据库中的过程。配对绑定过程只会发生在两个设备之间第一次连接,因为在第一次配对绑定过程中已经进行了密钥存储,如果这个存储的数据库没有人为的清空,那么之后的连接就不会再出现配对过程
1、配对特征交换得到临时密钥TK
2、身份确认以及短期密钥STK的产生
3、传输特定密钥
PS:第一、第二阶段为配对过程。第三阶段时绑定过程,此阶段传输的数据是通过第一、二阶段的短期密钥进行加密传输的
配对特征交换:
配对特征交换的是输入输出(IO)功能、认证需求(需不需要绑定以及防止MITM )、密钥大小(固定为128bit)。在BLE4.0协议中根据保护程度,协议中将安全分为3种特性:
这里的中间人MITM的意思是第三方的蓝牙设备。可靠中间人保护就是在 TK 共享是不会有第三方设备知道共享的TK 密钥;不可靠无中间人保护就是说 TK 共享时第三方设备很容易知道共享的 TK 值,所以是不可靠的传输;而无保护是不怕被别人盗取数据
输入输出能力:输入和输出的组合决定采用什么方式生成TK
配对特征交换时, 各自将自己的综合能力发送给对方设备,最后根据两个设备的能力最终选择那种方式实现 TK 值的共享。在BLE4.0协议规范中其实是有三种方式决定TK值:
Just Work(只工作):两设备使用的是默认的TK值(6 个 0)。对于这种方式是一个不可靠的加密链路,它不能防止MITM攻击。这种方式使用时可靠的前提是,确保在配对绑定是能保证没有 MITM 攻击,那么在之后的连接中加密的数据是无法被其它设备窃听的,也就是说这种方式能保护将来加密链路安全,但是不能保护配对绑定过程
Passkey Entry(输入密码):对于输入密钥来说: 两个设备中 ,一 个蓝牙设备在自己的显示屏上显示随机6位数;而操作人员看到这6位数后,将这6位数在另一个蓝牙设备中输入,从而实现两个设备的TK值一样
Out of Band(带外):带外是使用另一无线方式将数据传给蓝牙设备,如果带外本身能防止MITM的攻击,那么传送的TK值肯定是受保护的。而且这种方式下的TK值是128bit的随机数,虽然还是有概率被第三方猜中,但是猜中128bit随机数的概率远比输入密码时的6bit的随机数要小
身份确认以及短期密钥STK的产生:
配对的第1阶段通过特征交换仅仅得到TK值,而TK值是用来做在第2阶段用来作为密钥进行计算两个重要的值:身份确认值和短期秘钥(STK)值
(1) 身份确认值:得到了TK值,是为了保证和自己通信的设备是自己需要连接的设备,必须通过某些计算来确定对方的身份。 两个设备都需要计算确认值,从而确定对方是所需要的连接的设备。所以分为主机确认值 / 发起者确认值 (Mconfirm) 计算和从机确 认值/响应者确认值(Sconfirm)计算
(2) 短期秘钥(STK)值计算:STK存在的目的在于配对绑定过程的第3阶段不再使用明文进行数据传输,而是使用STK作为长期秘钥LTK将需要交互的数据进行加密,第3阶段传输是在未来加密链路中使用到的LTK、IRK 以及 CSRK 等等密钥。然而 STK 或者 LTK 并不能直接作为将来要发送的数据包进行加密的密钥,为了传输的数据包更加的安全,加密数据包的密钥是会话密钥Session Key(SK),SK是用STK 或者 LTK 当做密钥计算得到的。当两个设备第一次进行配对绑定时,在第3阶段就需要进行加密链路传输数据,而此时长期密钥LTK是没有共享的,所以需要通过第 2 阶段计算得到的STK作为来计算会话密钥SK
特定密钥的计算:
在配对绑定的第3个阶段传输就是两个设备商量好了的特定的密钥。
(1) 长期密钥的计算公式LTK = d1(ER,DIV,0) = e(ER,0 || DIV),ER是一个128bit的伪随机数,DIV=EDIV XOR Y 或 EDIV=DIV XOR Y,Y 也是通过计算得到的,EDIV即为加密分散器,这个值是在配对绑定过程中是由从机发送给主机, 而配对绑定完之后的连接是由主机发送给从机,从而计算出长期密钥 LTK。一方面在未来的连接过程 LTK 不通过明文发送保证 LTK的安全性;另一方面从机不存储配对过程中交换的某些密钥信息,可以减少对从机硬件要求
(2) 设备地址类型和身份解析密钥 IRK:设备地址共分为两类:公共地址和随机地址,而随机地址中的私有地址中的可解析私有随机地址的最高两bit为10,最高 bit为0,可解析私有随机地址的生产和解析都需要知道设备的身份解析密钥(IRK), 如果知道对方的IRK就能解析出对方的身份, 本地设备通过IRK也能计算出一个可解析的随机地址, 这就是身份解析密钥的功能
连接签名解析密钥CSRK:
在数据签名认证时需要使用到 CSRK 密钥,计算公式:CSRK = d1(ER,DIV,1) = e(ER,1||DIV)
签名计算:
(1) 签名认证所有计算其实在数据PDU中就是信息完整性检查(MIC)这4个字节。公式MAC = CMAC(K, M, Tlen),其中 MIC 就是 MAC,其参数 k 即为连接签名解析密钥CSRK; Tlen 为固定的 64bits 也就是 8 字节长度;而 M 是一个可变长的数,它包括包计数器和具体数据这两个部分拼接而成,计数如下:M = data || SignCounter
(2) 例如,假设需要签名的数据是7字节的数据3456789ABCDEF1,而计数器SignCounter为 67653874 (0x040850F2),那么 M 的值为3456789ABCDEF1F2500804。前文提到的数据包中包含有一个包计数值,实际上并不是直接发送一个包计数值,而是通过计算包含在 MAC 即MIC 中的
加密过程不仅仅是 SM 层单独完成的,还有一些参数是由 LL 层进行传输的,像启动和停止加密都是有LL层进行控制的。
PS:EDIV 和 Rand 参数就是决定STK作为LTK计算SK 的评判标准,当EDIV和Rand都为0时,表示这个加密请求是两设备的第
一次配对绑定,所以要用STK作为LTK 使用;当EDIV和Rand不为0时,表示之前这两个设备已经配对过,这个值是在第一次配对时从机发送给主机的,可以知道只有第一次配对绑定过程才有安全管理协议参与,之后的连接只需链路层进行控制