总述
配对(Pairing)分为三个阶段,前两个阶段是必须的,而第三阶段是可选的,三个阶段如下:
阶段1:配对功能交换(Pairing Feature Exchange)
阶段2(LE传统配对 LE legacy pairing):短期密钥(STK:Short Term Key)生成
阶段2(LE安全连接 LE Secure Connections,也叫LESC):长期密钥(LTK:Long Term Key)生成
阶段3:分发特定密钥的传输(Transport Specific Key Distribution)
可以看到阶段2分为两种:一种是LE传统配对,或者叫做LE遗留配对,它为了兼容低功耗蓝牙以前的配对而存在。另一种是蓝牙4.2新引入的LE安全连接,它安全性会更高。
这三个阶段的流程如下图所示:
上述流程可以很清晰的看出来每个阶段做的事:
阶段1两个设备交换身份验证要求和IO(Input Output输入输出)能力,随后阶段2会根据这些能力决定使用以下哪种协议生成密钥:
1.Just Works
2.Numeric Comparison (仅在LESC中可用)
3.Passkey Entry
4.Out Of Band (OOB)
从阶段1交换的信息中还会确定是使用LE传统配对还是LESC。 阶段3只有在以下三种情况时才可选:
1.阶段2选择了LE传统配对,生成了STK
2.阶段2选择了LESC,生成了LTK
3.使用BR/EDR配对,生成了共享链路密钥
注意:阶段1和阶段2可以在加密链路上执行,也可以在不加密链路上执行!
阶段1:配对功能交换
阶段1的配对功能交换主要用于交换一下信息:
1.输入输出能力(IO capabilities)
2.oob认证数据是否可用(OOB authentication data availability)
3.认证要求(authentication requirements)
4.密钥大小要求(key size requirements)
5.要被传输的分发密钥(包括自己和对方的)
其中1、2、3被用作选择阶段2使用哪种密钥生成方法的条件。5则决定了阶段3会分发哪些密钥。选择LE传统配对的密钥生成方法的话,一定会生成两个密钥:TK(Temporary Key,临时密钥)和STK(Short Term Key,短期密钥)。TK用于配对过程中加密,这个过程中会再生成STK。而STK用于配对后的加密连接。
选择LESC的密钥生成方法的话则一定会生成LTK(Long Term Key,长期密钥),用于配对后以及再次连接时加密连接。
实际空中交互的数据包如下:
输入输出能力
输入能力被分为三种:
1.No input:没有输入能力
2.Yes/No:有输入是或者否的能力,比如两个按键,一个是“是”,一个是“否”,或者更简单只有一个按键,按下就是“是”,超过一定时间没按下就认为是“否”。
3.Keyboard:设备可以输入数字0~9和确认。还应该有上述Yes/No的能力。
注意:能力3包含了能力2。
输出能力被分为两种:
1.No output:设备没有显示或者交流6位10进制数字的能力
2.Numeric output:设备具有显示或者交流6位10进制数字的能力
根据输入输出组合,IO能力分为以下六种:
注意,因为没有一个算法可以给输入是Yes/No,输出是No output所使用,所以这种类型也是 NoInputNoOutput 。
实际空中交互的数据包中,数值定义如下:
带外认证数据
LE传统配对中,两个配对的设备都必须有对方的oob数据,才会选择oob方式。
LESC配对中,两个配对的设备只要其中一个有对方的oob数据,就选择oob方式。
实际空中数据包数值如下:
认证要求
空中报文包含如下参数:
Bonding_Flags:是否绑定标志
MITM:是否启用中间人保护标志
SC:是否支持安全连接标志
Keypress:是否启用密钥输入标志,只在Passkey Entry协议中有效
CT2:是否支持h7函数标志
密钥大小要求
每个设备都有两个参数:最大密钥长度和最小密钥长度。它们的范围都在7~16个字节以内。发起设备和响应设备的最大密钥长度中较小的那个作为协商出来的密钥长度。协商得到的密钥长度不能小于自己支持的最小密钥长度,否则应该发送"Encryption Key Size"作为配对失败的错误码。
如果密钥小于16字节,优先屏蔽高位。
分发密钥
有以下密钥可以选择分发:
IRK(Identity Resolving Key)身份解析密钥
CSRK(Connection Signature Resolving Key)连接签名解析密钥
LTK长期密钥
EDIV(Encrypted Diversifier)加密分流器
Rand随机值
阶段2:LE传统配对
前面已经说过,阶段1的参数会影响阶段2如何选择密钥生成协议,在LE传统配对中关系如下:
上图总结一下就是:
只有当两个设备的oob flag都置位时,才选择使用oob配对。否则就看MITM置位没有,如果都没有置位,那就选择Just Works,否则就根据IO能力判断使用哪种。根据IO能力判断的方法如下:
从上图可以看出来需要综合发起设备和响应设备的IO能力确定最终选择的协议。
LE传统配对支持3种协议:
Just Works、Passkey Entry、OOB
LE传统配对--Just Works
该方式在配对过程中没有机密性可言,只要存在窃听者或中间人就可能让后续加密失效。选择该方式时,TK固定为0。
LE传统配对--Passkey Entry
对于此方式来说,最少需要一方能输入10进制数字,另一方能显示6位10进制数字,这样可以一方显示,另一方把显示的数字输入进去。或者两方都可以输入数字,此时两方都输入相同的数字。当然最好是两方都既可以显示也可以输入。如果两方都只能显示,在LE传统配对中是不行的。
如果输入的6位10进制数字是 019655 ,则实际TK=0x00000000000000000000000000004Cc7
注意,密钥输入协议提供对MITM攻击的保护,但是0~999999的数字,中间人任选一个,都有0.000001的概率猜对。
LE传统配对--OOB
oob长度为16位,所以理论上能提供比Passkey Entry更高的安全性。但是前提是带外传输的数据不能被中间人截取,所以安全性完全取决于oob的方式。
oob协议中,TK的值就是oob的那16个字节。
阶段2:LESC配对
和LE传统配对不同,它选择密钥生成方式的方法如下:
可以看到最明显的区别是,只要任意一方有oob,就可以使用oob。
LESC配对--公钥交换
LE安全配对的第一步是交换公钥。两个设备都先选择一个随机数作为私钥SKa、SKb,然后用算法生成对应的公钥PKa、PKb。然后发起设备和响应设备交换公钥,然后各自用自己的私钥和对方的公钥生成密钥DHKey,注意两边生成的DHKey相等。如下图所示:
这一步假如有人中间截获了PKa和PKb,无法求出DHKey。
LESC配对--Just Work 和 Numeric Comparison
Just Work的关联模型和Numeric Comparison(数字比较)共用一个。整体流程如下:
首先在第一步两边交换了公钥,所以设备A和设备B都有PKb和PKa了,然后两个设备都再各自选择一个随机数分别是Na和Nb。响应设备通过函数f4以及参数PKb、PKa、Nb计算出Cb,然后把Cb发给设备A,然后两个设备再交换Na、Nb。同时设备A检查Cb是否正确,如果不正确,则配对终止,否则设备A计算Va,并显示在显示屏上。与此同时,设备B在发送完Nb后就可以计算Vb并显示了,这时候就需要人参与了,如果两个设备上显示的数字相同,则在两个设备上点击确认,继续下面的流程。Just Works因为没有显示,所以不会执行7a、7b,也没有Va,Vb需要显示,自然也不需要人参与判断是否继续配对。
假如存在中间人拦截并篡改数据,有0.999999的概率导致配对双方显示不同数字,从而配对失败。
LESC配对--Passkey Entry
其实看得懂上一节的图,这一节的图大同小异。首先人参与输入数字,在设备A和B上分别输入相同的数字,或者一方显示,另一方输入,两个设备得到两个相等的数字ra=rb。然后实现以下过程:
//因为ra/rb最大为999999,20位,所以每次取一位需要取20次
for(int i=0;i<20;++i)
{
/*设备A上实现:*/
//每次循环都会重新生成Na/Nb
Na = rand();
//每次计算取ra/rb的一位参与计算
Ca = f4(PKa,PKb,Na,ra&(1<<i));
/*设备B上实现:*/
Nb = rand();
Cb = f4(PKa,PKb,Nb,ra&(1<<i));
/*都生成后,设备A/B互换Ca和Cb*/
}
每次生成的Ca和Cb都会互相发送给对方,让对方检查,如果失败就直接退出配对。
LESC配对--OOB
上图流程为:
设备A和设备B分别选择一个随机数ra和rb,然后用函数f4计算出Ca和Cb。通过带外的方式(比如串口)交换两个设备的地址A、B和ra、rb、Ca、Cb。双方拿到对方的数据后检测,如果成功,再各自选取一个随机数Na、Nb交换。
LESC配对--长期密钥推导
文章推荐:
低功耗蓝牙配对绑定解读和实践
【精选】BLE安全之SM剖析(2)_ble just work_物联网布道师的博客-CSDN博客
BLE安全机制从入门到放弃 | Jayden's Blog