1.简介

 Paring(配对)Bonding(绑定)是实现蓝牙射频通信安全的一种机制,有两点需要注意:

  1. Paring/bonding实现的是蓝牙链路层的安全,对应用层来说是完全透明的。也就是说,不管有没有paring/bonding,应用层数据的收发方式都是一样的,不会因为加了paring/bonding而使应用层数据传输需要做某些特殊处理。
  2. 安全有两种选项:加密签名。目前绝大部分应用都是选择加密

        实现蓝牙通信安全,除了paring/bonding这种底层方式,用户也可以自己在应用层去实现相同的安全功能。从功能上来说是没有太大区别的,不同的是应用层安全自己实现的话,需要自己选择加密算法、密钥生成、密钥交换等。如果不是这方面的专家,很有可能会有安全漏洞。而蓝牙的paring/bonding则把上述过程标准化,放在了蓝牙协议栈里。并且其安全性得到了充分的评估,用户可以“无感”使用安全的蓝牙通信。

sercurity manager(SM)的一部分,SM定义了蓝牙通信的安全架构,里面涉及安全架构密码工具箱paring协议等。其中paring协议是关键,所以经常把paring和SM二者等价。

2.配对

找到确定需要和自己通信的设备,也就是身份确定。接着是安全密钥共享,而这一过程仅仅是由启动加密到得到短期密钥(STK)为止。其包括配对能力交换设备认证密钥(固定128bit)生成连接加密以及机密信息分布等过程。配对的目的有三个:加密连接、认证设备、生成密钥

BLE的配对过程发生在连接过程之后

MasterSlave。Master是连接的发起方,可以决定和连接有关的参数。Slave是连接的接收方,可以请求连接参数,但无法决定。

Master和Slave通过协商确立用于加(解)密的Key的过程",主要由三个阶段组成:

第三阶段时可选的

  • 第一阶段:配对特征交换。称作“Pairing Feature Exchange”,用于交换双方有关鉴权的需求(authentication requirements),以及双方具有怎样的人机交互能力(IO Capabilities)
  • 第二阶段:短期密钥(STK)生成。通过SMP协议进行实际的配对操作,根据阶段一“Feature Exchange”的结果,有两种配对方法可选:LE legacy pairing和LE Secure Connections
  • 第三阶段:传输特定密钥分配。该阶段时可选的,经过阶段一和阶段二之后,双反已经产生了加密key。因此可以建立加密的连接。加密连接建立后,可以互传一些私密的信息,例如Encryption Information、Identity Information、Identity Address Information等。

注:STK的生成规则如下:

Just work没有加密,TK=0X00。Just works方式不能抵抗窃听者和中间人攻击,只有在配对过程时没有遭受攻击,后面加密的链路数据才是可信的。安全级别很低

passkey entry密码输入。如果passkey是“019655” ,TK的值就是0x00000000000000000000000000004CC7。(0x4cc7就是19655的16进制数)。将输入的值作为一个6位数的十进制,转换为15字节的十六进制。

OOB(Out of band)带外的TK值,是一个16字节的随机数,通过非BLE的方式传递给对端。例如二维码或IR红外。对于蓝牙窃听者/攻击者而言,这个data的传输是不可见的,因此会显得安全很多

Android 蓝牙配对为什么不弹PIN码对话框 为什么蓝牙匹配_配对

Android 蓝牙配对为什么不弹PIN码对话框 为什么蓝牙匹配_应用层_02

 2.1 配对请求的数据格式

        

Android 蓝牙配对为什么不弹PIN码对话框 为什么蓝牙匹配_配对_03

IO capabilities表明输入,输出的能力。

输入是按键、键盘输出是显示数字用的界面

  •         0x00(Display Only)只能 显示000000~999999的数字
  •         0x01(Display YesNo)显示Yes/No的按钮
  •         0x02(Keyboard Only)只能输入000000~999999的数字
  •         0x03(No input No output)没有输入也没有显示,只能用Just work工作方式
  •         0x04(Keyboard Display)能输入000000~999999的数字,也能有屏幕显示。

OOB data flag

  •         0x00        OOB数据没有发送
  •         0x01        OOB数据通过远端设备发送(如IR)
  •         0x02-0xFF 保留

3.绑定

长期密钥(LTK,long-term key),如果配对双方把这个LTK存储起来放在Flash中(有的时候是长期密钥、身份解析密钥、连接签名解析密钥这三个秘密要的某一个或组合进行交换,然后将交换的密钥存储到数据库中),那么这两个设备再次重连的时候,就可以跳过配对流程,而直接使用LTK对蓝牙连接进行加密,设备的这种状态称为绑定(bonding)

第一次配对时才会发生,后续的连接由于第一次的配对绑定已经有“Bonding”过程(即存储),如果存储的数据库没有被认为的清空,后续的连接不需要再次配对。并不是所有的通信都需要加密进行数据保护,因此,建立连接之前不一定需要配对和绑定,可以直接建立连接。

4.总结

         BLE的配对和绑定是一连串的动作,总结下来可以用下图来表示。

        

Android 蓝牙配对为什么不弹PIN码对话框 为什么蓝牙匹配_配对_04

  • 阶段1:配对特征交换,得到临时密钥(TK)值(配对请求、配对响应)
  • 阶段2:身份确认以及短期密钥(STK)生成(通过安全管理协议(SMP)配对),确定自己正在和一个真正想要通信的设备通信,而非第三方。即确定对方身份。
  • 阶段3:传输特定密钥(密钥分配)。绑定所需存储到安全数据库的数据也是在此阶段发送的。

        上述三阶段总结:

  1. 配对认证:主从机一方提供密码一方输入密码,如果双方密码一致,那么此密码将作为TK(临时密码)
  2. 加密链路:利用得到的TK(临时密码)等信息计算出STK(短期密码)用来做加密认证
  3. 绑定:加密认证通过后,利用STK等信息生成LTK(长期密码),把LTK保存下来用于下次连接时做加密认证,不需要再次配对就可以加密链路。这就是绑定

每次连接时,从机会向主机发送安全请求。如果主从机相互绑定过,主机不会发送配对请求,主机直接利用绑定时保存的LTK发送加密请求。从机也会利用绑定时保存的LTK来做加密回复,三次握手成功后(加密成功,三次握手通讯由底层完成,用户不可见),从机回复主机加密状态success。

        建立连接是使用的静态密码,解除绑定/配对是使用的动态密码。回连也需要密码,使用的是动态密码,这是为了防止窃听,起保护作用。为了防止泄露信息,用户也可以自行在应用层去实现相同的功能。

        配对和绑定的区别:

1.连接:通讯的基础,通讯数据为明文

2.配对:配对仅仅是为了在连接的基础上加密(通讯数据经过加密为密文)。提高蓝牙链路传输的安全性。不配对也能连接进行通信

3.绑定:绑定是配对发起时的一个可选配置。把配对信息记录下来,下次不用配对自动进入加密的连接。所以没有在bonding列表里的设备不影响连接

经常把paring当成paring和bonding两者的组合,因为只paring不bonding的应用情况非常少见