BLE的配对是一个比较繁琐的过程,需要熟悉规范,只有明白其中的原理才能更好的理解这个过程。
首先需要明确一点:配对的目的是为了加密通讯链路,保证数据安全,绑定是为了简化配对流程。

配对绑定过程说明:
1 配对信息的交换
2 生成STK(短期秘钥)加密链路
3 链路加密后就可以安全分发各种秘钥了,如果需要绑定,那么也会生成LTK(长期秘钥),双方都会存储LTK。
4 LTK分配之后,每次重新连接时双方用LTK与会话秘钥分散器等其他信息最终生成一个会话秘钥,真正的加密是用这个会话秘钥,其实这点也与大多数加密机制类似。

下面简单分析一下nrf协议栈中关于配对部分的流程。
在NRF52832(SDK 11.0 softdevice s132)中与链路安全相关的事件:
BLE_GAP_EVT_SEC_PARAMS_REQUEST
BLE_GAP_EVT_SEC_INFO_REQUEST
BLE_GAP_EVT_CONN_SEC_UPDATE
BLE_GAP_EVT_AUTH_STATUS

(1)在配对信息交换阶段,BLE_GAP_EVT_SEC_PARAMS_REQUEST事件会由协议栈上报给应用层:

(2)在这个事件中,从机会把自己的信息与主机进行交换,其中就包含了从机的IO能力、配对完成是否绑定等(在sd_ble_gap_sec_params_reply第三个参数定义)信息。
1) 如果指定了从机具有显示能力,即BLE_GAP_IO_CAPS_DISPLAY_ONLY,那么调用sd_ble_gap_sec_params_reply后,应用层会收到BLE_GAP_EVT_PASSKEY_DISPLAY事件,从机将协议栈生成的随机密码显示到屏幕即可,此时主机也会出现一个配对框,用户输入从机显示的密码即可完成配对。若从机没有输出能力,那么可以指定为BLE_GAP_IO_CAPS_NONE,此时主机不再要求输入密码,而是询问是否同意配对。若密码匹配或用户同意配对,那么配对过程继续,直到协议栈上报BLE_GAP_EVT_CONN_SEC_UPDATE事件代表配对成功:

  1. 如果指定配对完成后绑定,那么协议栈会进行LTK的分发,秘钥分发完成后,协议栈会上报BLE_GAP_EVT_AUTH_STATUS事件表示:

    (3)LTK分发完成后,从机可以将协议栈返回相关秘钥信息保存下来:

    至此整个配对绑定过程完成。

下面再分析一下,当链路重新建立时的情况。
上面提到,绑定操作是为了简化配对流程。当双方都保存有配对信息时(最重要的是LTK),可以直接使用LTK参与会话秘钥的生成,一般情况下,主机会发起加密请求,从机会响应加密请求,在nrf协议栈中,相关事件是BLE_GAP_EVT_SEC_INFO_REQUEST:

收到BLE_GAP_EVT_SEC_INFO_REQUEST事件后,从机会查询本地有没有当前连接的主机相关秘钥信息,并把查询结果传递到协议栈给主机回应。那么到底是以什么作为匹配标准来查询这个秘钥信息呢,首先想到的是主机的MAC,没错,确实是MAC地址,但是除了MAC地址,还有一项diversifier(分散器),记为EDIV:

如果单单是MAC地址,就无法解释iOS系统Private Non-Resolvable address的现象:iOS每次重启系统或重启蓝牙,BLE的MAC地址都会被改变,话说是为了防止设备被追踪。
diversifier的值由发起配对的一方传送,接收的一端进行匹配,除了diversifier之外,还有随机数Rand、初始向量IV等与加密相关的参数随着加密请求LL_Encryption Req发送给对方。
一旦匹配成功,后续通讯链路就可以进入加密状态,下面是通过空中抓包关于主机发起加密的过程:

可以看到,在M->S的加密请求包中,包含了4个域,都是与加密相关的字段,其中一项就是EDIV,随后S->M的加密响应中,从机向主机传送了自己的STK和IV,主从双方准备好之后,从机发起开始加密请求,在随后的数据包中,协议分析软件显示多了一项Security_Enabled,可知链路已进入了加密状态。

如若一切顺利,上述过程没有什么问题,一旦一个环节出错,配对就无法完成了。例如当从机保存的配对信息失效了(一般会保存在Flash中,Flash并不是百分之百可靠),就无法再正确的进行链路加密。
在我的这个案例中,从机是nrf52832,主机是iOS系统,业务流程简单:
从机通过用户app配对完成后,可以脱离app而独立工作,并接收ANCS消息。
在测试过程中发现,主机在断线后(时间和次数不确定),不再主动连接从机,手动连接从机后,ANCS通知也不正常,并且再次断线后也不会回连。

经过无数次的问度娘,也没有找到相关的问题,最后无奈,只能使出杀手锏:通过抓包分析

可以看到,主机在连接上从机后与从机交换了协议版本信息,接着就发送了一条加密请求,要求从机进行链路加密,后面的数据包中,我们看到从机第二次回应时,发送了一个LL_Reject_Rsp,一开始不知道这个包的含义,但是Reject明显不是什么好事,对比正常的响应包,此处应该是Start_Encryption Req才对,经过多次实验得知,iOS系统在5次重连发加密请求都收到LL_Reject_Rsp时,就不会再回连该从机(目前还没找到apple相关资源), 那么,我的思路就是在从机查找不到主机的配对信息时,向主机发起配对请求,要求用户重新确认并配对。


核心操作就在dm模块:dm_security_setup_req(),向主机发起配对请求。
这个方案基本上可以解决这个问题,但如果用户没有来得及产看手机并确认配对,且重连次数连续超过5次,系统还是会停止回连从机。

NRF52832配对与绑定问题相关推荐

  1. nrf52832 学习笔记(六)配对和绑定

    nrf52832 学习笔记(六)配对和绑定 配对绑定推荐博客低功耗蓝牙配对绑定解读和实践 蓝牙在配对之前都是明文通信的,也就是说主从机之间传输的数据包可以被第三方抓取分析逆向,而且如果没有配对,谁都可 ...

  2. android ble 蓝牙绑定流程,BLE 配对与绑定过程详细解析

    1. 蓝牙绑定 绑定真正来说属于通用访问规范的讨论范畴.绑定指的无非是将密钥及相关身份信息保存到数据库中.如果设备不保存这些值,他们虽然能匹配,但不能绑定. 只要当中某一个设备不保存,重新连接后,只有 ...

  3. android ble配对绑定,Android蓝牙(一)搜索配对和绑定

    蓝牙技术在智能硬件方面有很多用武之地,今天我就为大家分享一下蓝牙在Android系统下的使用方法技巧,并实现一下两个终端间数据的传输. 蓝牙(Bluetooth)是一种短距离的无线通信技术标准,蓝牙协 ...

  4. 蓝牙加密二【配对和绑定的关系和定义】【IO Capabilities】【sec_params.rsp_key】【BOND MODE】【加密方式】【Encryption Procedur】【计算MIC】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

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

    1.简介  Paring(配对)和Bonding(绑定)是实现蓝牙射频通信安全的一种机制,有两点需要注意: Paring/bonding实现的是蓝牙链路层的安全,对应用层来说是完全透明的.也就是说,不 ...

  6. 蓝牙配对模式 java_BLE(低功耗蓝牙)配对和绑定

    1)BLE安全性是一件复杂的事情,如果您不是这方面的专家,最好确保构建应用程序的堆栈为您执行此操作 . 在Android(以及iOS上,我想),内置堆栈将在您启动后立即为您配对,但在您自定义构建的&q ...

  7. 蓝牙配对,解决蓝牙多次连接不上的问题

    文章目录 nRF52832 配对和绑定 1.在连接时,nRF52832向蓝牙主机发送配对请求 2.主机收到配对请求后,向nRF52832发送安全参数请求,nRF52832收到后回复请求 3.判断配对是 ...

  8. CC2640R2F之配对绑定与解除绑定篇

    蓝牙协议栈:simplelink_cc2640r2_sdk_1_40_00_45 IAR版本:IAR for ARM 8.11.3 开发板:CC2640R2F 蓝牙版本:BLE4.2 配对模式:Pas ...

  9. 一篇文章带你解读蓝牙配对绑定

    BLE配对绑定解读 什么是低功耗蓝牙配对?什么又是绑定?配对和绑定有什么区别?配对有什么好处?如何删除绑定信息?如何确定配对的安全等级?just work的配对一定就不安全吗?如何开发自己的配对应用? ...

最新文章

  1. CVPR2020论文解析:视频语义检索
  2. snapd_snapd使管理Nextcloud变得轻而易举
  3. java选择哪款eclipse_写java程序用哪一个版的eclipse比较好
  4. 牛客网(剑指offer) 第十四题 链表中倒数第k个节点
  5. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 SAP UI5 表格控件使用方法介绍
  6. LeetCode 1640. 能否连接形成数组(哈希)
  7. 如何将vue项目打包为.apk文件
  8. WAS生成的文件:javacore.***.txt 、heapdump.***.phd、core.***.dmp、Snap.***.trc
  9. 【转】java获取当前路径的几种方法
  10. 从10秒到2秒!ElasticSearch性能调优实践
  11. python 时间处理_Python如何进行时间处理
  12. PHP 删除文件,文件下的目录
  13. 2009中国IT界名人
  14. 南昌大学计算机学院夏令营,“优秀大学生暑期夏令营”参营营员名单公示
  15. SQL Server的Descending Indexes降序索引
  16. [USACO18FEB] Rest Stops(贪心)
  17. 关于网页显示夏令时时区问题
  18. CentOS 7 源码编译安装 Nginx
  19. 查找并下载开放的音乐数据(.mp3)
  20. python初学者爬虫教程(二)动态网页抓取

热门文章

  1. CTF各种资源:题目、工具、资料
  2. html 飘动的广告,很实用,很经典的jQuery漂浮广告
  3. 电商项目之电商数据库建表
  4. Vue使用Echarts实现数据可视化
  5. GP2Y1010AU0F使用心得
  6. 【分布式架构的原理】淘宝的演进过程
  7. Axure RP教程
  8. matlab insar toolbox,insarmatlab DBT 2.0 工具箱,用于雷达、阵列信号处理仿真 256万源代码下载- www.pudn.com...
  9. NC用友导入凭证失败错误:凭证内部错误号:[10044]
  10. NOIP2017 滚粗记