蓝牙学习八(配对与绑定)

1.简介

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

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

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

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

2.配对

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

        区别于传统蓝牙的配对过程,BLE的配对过程发生在连接过程之后

        和经典蓝牙一样,协议为处于连接状态的BLE设备,定义了两种Link Layer角色:MasterSlave。Master是连接的发起方,可以决定和连接有关的参数。Slave是连接的接收方,可以请求连接参数,但无法决定。

        在SM(Security Manager)的规范中,配对时指"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的传输是不可见的,因此会显得安全很多

 2.1 配对请求的数据格式

        

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的配对和绑定是一连串的动作,总结下来可以用下图来表示。

        

  • 阶段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的应用情况非常少见

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
步骤: 1. 两个蓝牙模块必须一个作为主机,另一个作为从机才能建立连接(上电后,从机一直处于接受状态,等待被连接。而主机则主动发出信号,寻找目标从机,前提是该目标从机的mac地址事先被写入到主机的flash芯片中储存) 2. 蓝牙模块上电前一直按住key按键不放,上电后松开,此时LED灯处于慢闪状态(每秒闪1次),提示已经进入AT指令响应状态,可以进行接收AT指令控制 3. PC端打开安可信串口助手(带AT指令),打开相应的串口,发送AT+ROLE?\n查询该模块的主从角色,如果为0,则为从机,如果为1则为主机。本例中,此模块(图中左边的HC-05模块)设为主机,则发送AT+ROLE=1\n,设为主机,成功返回OK 4. 发送AT+ADDR?\n查询此模块的mac地址,本例中为98d3:33:80ebdf,记下来稍后为从机的地址用。同样的方法将另一个模块(图中右边的HC-05模块)设置为从机(AT+ROLE=0\n),并且查询到mac地址为98d3:36:aac2 5. 向主机串口中发送AT+BIND=98d3,36,aac2\n从机的mac地址,成功则返回OK。发送AT+CMODE=0\n将主机设为指蓝牙地址连接模式(即只允许主机向好mac地址的蓝牙从机设备发起连接) 6. 同样地,向从机串口发送AT+BIND=983d,33,80ebdf\n主机的mac地址,成功则返回OK。发送AT+CMODE=0\n将从机也设为指蓝牙地址连接模式(即只允许从机接受好mac地址的蓝牙主机设备发起的连接) 7. 至此,主从机均设置完毕。主从两模块松开key键重新上电,LED都快闪(每秒闪2次),表明均处于等待配对状态,随后大约几秒钟后,LED闪烁频率发生变化(不确),表明已经侦测到目标设备,正在建立连接。随后大约一秒钟,很快 LED变成慢双闪状态(每2秒闪一次,每次连闪2下),提示已经配对成功,可以通过蓝牙协议传输数据了 8. 此时,在串口助手中发送一串字符,如果另一个蓝牙模块的串口助手里收到了同样的字符,且回送的字符,对方亦能收到,则通信成功。
在 Android 中,蓝牙配对的过程主要包括以下几个步骤: 1. 打开蓝牙:使用 `BluetoothAdapter` 类来打开蓝牙。 ``` BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { // 设备不支持蓝牙 return; } if (!bluetoothAdapter.isEnabled()) { // 请求打开蓝牙 Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } ``` 2. 搜索设备:使用 `BluetoothAdapter` 的 `startDiscovery()` 方法搜索蓝牙设备。 ``` bluetoothAdapter.startDiscovery(); ``` 3. 显示设备列表:在 `onActivityResult()` 回调中,可以获取到蓝牙设备列表,并显示在界面上供用户选择。 ``` @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_ENABLE_BT && resultCode == RESULT_OK) { // 蓝牙已成功打开 // 开始搜索设备 bluetoothAdapter.startDiscovery(); } if (requestCode == REQUEST_CONNECT_DEVICE && resultCode == RESULT_OK) { // 用户已选择设备 String address = data.getStringExtra(DeviceListActivity.EXTRA_DEVICE_ADDRESS); BluetoothDevice device = bluetoothAdapter.getRemoteDevice(address); // 开始配对 pairAndConnect(device); } } ``` 4. 配对设备:使用 `BluetoothDevice` 的 `createBond()` 方法进行配对。 ``` private void pairAndConnect(BluetoothDevice device) { try { Method createBondMethod = BluetoothDevice.class.getMethod("createBond"); createBondMethod.invoke(device); } catch (Exception e) { e.printStackTrace(); } } ``` 在配对过程中,需要注意以下几点: - 配对是一个异步过程,需要注册广播接收器来监听配对状态的改变。 - 配对需要用户手动输入 PIN 码或者确认配对请求,因此需要显示系统的配对界面,让用户输入 PIN 码或确认配对请求。可以使用 `BluetoothDevice.createBond()` 方法来显示系统的配对界面,也可以自配对界面并使用 `BluetoothDevice.setPairingConfirmation()` 方法来确认配对请求。 - 配对成功后,需要使用 `BluetoothSocket` 类来建立蓝牙连接,并进行数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值