前言
SMP即Security Manager Protocol。其内容主要是配对和Key的分发,然后用Key对链路或数据进行加密。双方要共同拥有一个加密key(LTK,Long Term Key)。这个key至关重要,怎么生成、怎么由通信的双方共享,关系到加密的成败。因此蓝牙协议定义了一系列的复杂机制,用于处理和加密key有关的操作,这就是SM(Security Manager)。
1. Security Manager介绍
它的主要目的是为LE设备(LE only或者BR/EDR/LE)提供建立加密连接所需的key(STK or LTK)。为了达到这个目的,它定义了如下几类规范:
1)将生成加密key的过程称为Pairing(配对),并详细定义了Pairing的概念、操作步骤、实现细节等。
2)定义一个密码工具箱(Cryptographic Toolbox),其中包含了配对、加密等过程中所需的各种加密算法。
3)定义一个协议(Security Manager Protocol,简称SMP),基于L2CAP连接,实现master和slave之间的配对、密码传输等操作。
2. Pairing(配对)
区别于传统蓝牙的配对过程,BLE的配对过程发生在连接过程之后,配对是一个三阶段的过程。前两个阶段是必须的,第三阶段是可选的。
- 第一阶段:配对特征交换
- 第二阶段:短期秘钥(STK)生成
- 第三阶段: 传输特定秘钥分配
阶段1,称作“Pairing Feature Exchange”,用于交换双方有关鉴权的需求(authentication requirements),以及双方具有怎么的人机交互能力(IO capabilities)。
阶段2,通过SMP协议进行实际的配对操作,根据阶段1 “Feature Exchange”的结果,有两种配对方法可选:LE legacy pairing和LE Secure Connections。
阶段3是可选的,经过阶段1和阶段2之后,双方已经产生了加密key,因而可以建立加密的连接。加密连接建立后,可以互相传送一些私密的信息,例如Encryption Information、Identity Information、Identity Address Information等。
2.1 配对第一阶段
两个设备之间的配对信息交换是通过配对请求和配对响应数据包完成的。
当配对特性交换开始时,发起者和响应者将通过配对请求和响应相互交换配对特性信息。有了这些信息,发起者和响应者可以相互确定I/O能力,应该使用哪种配对机制(legacy pairing或LE Secure Connections),并选择配对方法(just work、Passkey Entry、Numeric Comparison or Out of Band),以便在阶段 2中使用。
配对特征交换的是输入输出(IO)功能、认证需求(需不需要绑定以及防止MITM )、密钥大小(固定为128bit)。
2.1.1 配对方法
Master和Slave有两种可选的配对方法:LE legacy pairing和LE Secure Connections,选择的依据是:当Master和Slave都支持LE Secure Connections 的时候,则使用LE Secure Connections。否则,使用LE legacy pairing。
2.1.2 Authentication(鉴权方式)
对BLE来说,主要有三类鉴权的方法,如下:
**JustWorks:**只工作,不需要用户参与,两个设备自行协商;安全级别很低。两设备使用的是默认的TK值(6 个 0);
PasskeyEntry:输入密码,通过输入配对码的方式鉴权;6位数是随机产生的在000000到999999之间的数值,这个数值相当于一个TK,比如远端显示这个数字,需要在本地端输入这个数字给本地设备与远端配对。如输入019655,那此时的临时Key–TK是:0x00000000000000000000000000004CC7。
OOB:带外,在配对过程之外,额外的交互一些信息,并以这些信息为输入,进行后续的配对操作。这些额外信息也称作OOB(out of band);这种方式是通过BLE之外的,设备上的其他方式来获取这个OOB data,比如通过IR红外,或其余的方式,因此对于蓝牙窃听者/攻击者而言这个data的传输是不可见的了,因此会显得要安全些。带外的TK值是一个16字节的随机数,通过非BLE的方式传递给对端。
2.1.3 IO Capabilities
Security Manager抽象出来了三种MITM类型的鉴权方法,这三种方法是根据两个设备的IO能力,在“Pairing Feature Exchange”阶段自动选择的。IO的能力可以归纳为如下的五种:
3.1.4 Authentication方法的选择
在“Pairing Feature Exchange”阶段,配对的双方以下面的原则选择鉴权方法:
1)如果双方都支持OOB鉴权,则选择该方式(优先级最高)。
2)否则,如果双方都支持MITM鉴权,则根据双方的IO Capabilities(并结合具体的配对方法),选择合适的鉴权方式(具体可参考BLE SPEC中的介绍)。
3)否则,使用Just work的方式(不再鉴权)。
2.2 LE legacy pairing
2.2.1 配对请求的报文格式
配对请求包格式如下图所示:
- Code (1 octet)
IO Capability (1 octet)
0x00 DisplayOnly 只能是显示000000 ~ 999999的数字
0x01 DisplayYesNo 显示Yes/No 的按钮
0x02 KeyboardOnly 只能是输入000000 ~ 999999的数字
0x03 NoinputNoOutput 没有输入也没有显示,只能用Just work工作方式
0x04 KeyboardDisplay 能输入000000 ~ 999999的数字和输出OOB data
0x00 OOB 数据没有发送
0x01 OOB 数据通过远端设备发送(如IR)
0x02-0xFF 保留AuthReq (1 octet)
AuthReq字段是一个位字段,指示STK和LTK以及GAP绑定信息的请求安全属性
BF, “Bonding_Flags”
绑定是指配对后交换长期密钥(LTK),并存储这些密钥供以后使用——这是在设备之间创建永久的安全性。
MITM
MITM域设置为1为请求MITM(中间人介入)保护,否则设置为0. 设备将标志设置为1为STK请求认证的安全属性。
选择Key生成的方法,如果auth Req中MITM没有,则说明不需要人参与中间,所以IO capabilities会被忽略,只用Just Works就OK了。如果有OOB data,auth Req将可直接忽略,会直接选择OOB的方式了。
“SC”
SC字段是一个1位标志,设置为1以请求LE安全连接配对。可能产生的配对机制是,如果两个设备都支持LE Secure Connections,则使用LE Secure Connections模式,否则使用LE legacy pairing模式。所以这个标志是确定第二阶段配对方法的指示位。
** MaxEncKeySize**
最大密钥长度,长度应该在7-16字节之间;
** InitiatorKeyDistribution**
该域表明秘钥初始化设备请求分配秘钥分配使用。
ResponderKeyDistribution
该字段表明秘钥初始化设备请求响应设备来分配秘钥分配使用。
EncKey是一个1位字段,它被设置为1时,应使用从BR/EDR链路密钥计算LTK的程序。
IdKey是一个1位字段,它被设置为1,表示设备应使用身份信息命令分发IRK,然后使用其公共设备或使用身份地址信息分发静态随机地址。
SignKey是一个1位的字段,它被设置为1,表示设备应使用签名信息命令来分发CSRK。
LinkKey是一个1位的字段。当SMP在LE传输上运行时,LinkKey字段被设置为1,以表示设备希望从LTK派生出LinkKey。当启动器和响应密钥分发/生成字段中的两个设备都将LinkKey设置为1时,应使用从LTK计算BR/EDR链路密钥的程序。不支持LE安全连接的设备应将此位设置为零,在接收时忽略。当SMP在BR/EDR传输上运行时,LinkKey字段将保留以供将来使用。
2.2.2 配对第二阶段
配对的第1阶段通过特征交换仅仅得到TK值,而TK值是用来做在第2阶段用来作为密钥进行计算两个重要的值:身份确认值(confirm)和短期秘钥(STK)值.
**pairing **
第一阶段的配对特征交换成功之后,用来启动STK生成。该命令被两个对等设备使用,来向对等设备发送确认值。初始化设备通过向响应设备发送配对确认命令启动STK生成。
1.Initiator生成128-bit随机数Mrand,并使用这个Mrand结合一些其他的输入,使用密码工具箱中c1计算出一个128-bit的Mconfirm值:
Mconfirm = c1(TK, Mrand,Pairing Request command, Pairing Response command,initiating device address type, initiating device address,responding device address type, responding device address)
Responder也生成一个128-bit随机数Srand,并使用这个Srand结合一些其他的输入,使用密码工具箱中c1计算出一个128-bit的Sconfirm值:
Sconfirm = c1(TK, Srand,Pairing Request command, Pairing Response command,initiating device address type, initiating device address,responding device address type, responding device address)
2.Initiator将其计算的Mconfirm值通过Pairing Confirm包发送给Responder,而Responder也将其计算的Sconfirm值通过Pairing Confirm包发送给Initiator;
3.Initiator收到Sconfirm后,再将Mrand值通过Pairing Random包发送给Responder;
4.Responder收到Mrand值后计算它的Mconfirm值,再跟前面那个Initiator送过来的Mconfirm值进行比较,若不同说明配对失败了。若相同,则Responder也会将它的Srand值通过Pairing Random包发送给Initiator;
5.而Initiator也会计算收到的Srand值的Sconfirm值,并跟前面那个Responder送过来的Sconfirm值进行比较,若不同说明配对失败了,若相同,继续。
短期秘钥(STK)值计算
得到 TK 后的另一个作用是计算短期秘钥,短期秘钥的使用的函数为 s1 函数。具体的 STK 计算如下:STK = s1(TK, Srand, Mrand)。
STK存在的目的在于配对绑定过程的第3 阶段不再使用明文进行数据传输,长期秘钥 LTK 的生成依赖STK,也就是说在绑定配对过程中,第 3 阶段就已经使用加密的密文传输。
然而STK或者LTK并不能直接作为将要发送的数据包加密的密钥,为了传输的数据包更加的安全,加密数据包的密钥是会话密钥Session Key(SK),也就是说会话密钥SK是用STK或者LTK当做密钥通过加密引擎函数 e 计算得到的,计算公式如下:SK=e(LTK,(SKDslave||SKDmaste))
2.2.3 配对第三阶段
第3阶段为设备绑定阶段,该阶段从机会计算产生LTK,并将LTK和计算LTK所用的EDIV和RAND两个值发给主机。主机将这三个值进行保存,这样两个设备就绑定成功了。
** 长期秘钥(LTK)产生**
在配对绑定的第3个阶段传输就是两个设备商量好了的特定的密钥,所有密钥都是通过计算得到。
长期密钥 LTK 使用的函数是d1函数。 计算如下:LTK=d1(ER,DIV,0)=e(ER,0||DIV)
所有的key和值都由主从设备分发。要分发的密钥由配对请求和配对响应的密钥分发参数决定,配对请求和配对响应来自第一阶段配对特征交换
一旦连接加密了,主机和从机之间就可以分发一些秘密信息。
如果是legacy paring,如下秘密信息必须分发:
LTK
EDIV
Rand
同时根据情况,legacy paring还需分发如下信息:
IRK
Identity address
如果是LESC paring,秘密信息分发是可选,一般有可能分发如下信息:
IRK
Identity address
** BLE的SMP的一些Key相关定义**
Long Term Key (LTK):加密链路用,128-bit;
Encrypted Diversifier (EDIV):在LE legacy pairing过程中,用于识别LTK分发,16-bit;
Random Number (Rand):在LE legacy pairing过程中,用于识别LTK分发,64-bit。
Identity Resolving Key (IRK):用于生成和解析random address用的,128-bit;
Connection Signature Resolving Key (CSRK):用于对数据进行签名已经验证签名数据,128-bit;
AddrType (1 octet)
如果BD_ADDR是公共设备地址,则AddrType应设置为0x00。
如果BD_ADDR是静态随机设备地址,则AddrType应设置为0x01。
BD_ADDR(6个八位字节)此字段设置为分发设备的公共设备地址或静态随机地址。
3. 绑定
就是将配对阶段产生的一系列key 保持到flash中,以便后续使用。如果配对的两个设备生成了LTK及其他秘密信息,并且把LTK及其他秘密信息保存到Flash等永久化存储设备中,那么我们就可以说这两个设备绑定成功。,paring强调认证和密钥生成,而bonding强调密钥保存。一旦两个设备bonding成功,那么这两个设备断开再次重连的时候,master就可以发起加密流程,从而使用paring生成的LTK对后续的连接进行加密。master发起加密连接流程如下所示:
BLE协议规定, 加密连接只能由master发起,不能由slave发起。slave可以发出加密请求,master收到slave的加密请求后,可以发起加密连接,也可以拒绝其请求。如下为master同意slave的加密请求流程:
总结
1.配对认证:主从机一方提供密码,一方输入密码,如果双方密码一致,那么此密码将作为TK(临时密码);
2.加密链路:利用得到的TK(临时密码)等信息计算出STK(短期密码)用来做加密认证;
3.绑定:加密认证通过后,利用STK等信息生成LTK(长期密码),把LTK保存下来,用于下次连接时做加密认证,不需要再次配对就可以加密链路,这就是绑定了;
绑定后通讯过程 : 每次连接时,从机会向主机发送安全请求,如果主从机相互绑定过,主机不会发送配对请求,主机直接利用绑定时保存的LTK发送加密请求,从机也会利用绑定时保存的LTK来做加密回复,三次握手成功后(加密成功,三次握手通讯由底层完成,用户不可见),从机回复主机加密成功。
参考文献:Bluetooth Core Specification v 5.0
版权归原作者 ShiLongBLE 所有, 如有侵权,请联系我们删除。