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

article/2025/10/8 12:03:25

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


http://chatgpt.dhexx.cn/article/AMSGFeNo.shtml

相关文章

蓝牙 - 配对和连接

什么是蓝牙配对? 蓝牙配对是为了连接设备的一种信息注册方法。通过在设备之间注册设备信息(配对),它们可以连接。要使用一个蓝牙设备,你必须首先将其与另一个蓝牙设备配对。配对有点像交换电话号码。类似于你必须与你…

Java 接口回调机制

日常开发中接口回调机制无处不在,刚开始用时却总是晕晕乎乎,网上也有很多相关的文章介绍,但总是没有看得太明白,今天端午假期正好花时间来总结一下,我们按如下顺序介绍 一、什么是接口回调 在应用开发中,接…

Android 接口回调

Android接口回调讲解 回调定义回调机制回调意义接口回调的实现步骤参考 网上看了一堆,感觉有点零散,我自己总结一下。 回调定义 正式定义 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一…

理解Java接口回调

初步认识: 实现步骤: 1、创建一个回调接口。 2、创建一个回调对象实现回调接口。 3、创建一个控制器对象,将回调对象作为参数传给控制器对象,控制器对象负责检查某个场景是否出现或某个条件是否满足,当满足时&#…

Android 自定义接口回调

1.定义一个简单的接口回调 下面是定义一个简单的接口,实现的功能是,设置名字爱好,并且返回给主 Activity。 1.1 自定义一个接口 定义一个名字为 setNameListener() 的接口类: /*** author: wu* date: on 2018/10/23.* describ…

接口回调(笔记

接口回调讲解 回调定义回调机制回调意义接口回调的实现步骤参考 网上看了一堆,感觉有点零散,我自己总结一下。看评论区说存在很多问题,我读了一下,雀氏存在一些,非常感谢批评指正,我重新写一写。&#xff0…

接口回调与方法回调

1.1 接口回调 简介: 笔者查阅了大量资料,接口回调没有定义,可以理解为是一种设计思想。 其本质是将实现接口的类通过向上转型至接口类型,通过传入不同的子类,实现调用相应的子类重写的父类接口方法。 详情见&#xff…

Java接口回调详解

一.产生接口回调的场景 在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,"通知我"这个动作就是接口回调的动作.接口回调重在理解思就好.再举个例子用于下面的代码演示,老师让学生做课堂练习,学生做完练习后并告诉老…

java 接口回调的例子_java接口回调

java的接口回调原理网上已经有很多生动形象的例子说明了,在此总结一下个人的理解:类A调用类B的方法b(),类B再回调类A的方法a(),其中方法a()是定义在接口中的,由类A来实现。这是一个双向调用的过程,用下面的类图来加以说明。 Callback.png 1. 创建一个接口: public inter…

巧妙理解接口回调

接口回调目的和用法解析 一、为什么会有接口回调?什么是接口回调? 其实这两个问题是一个问题,知道了接口回调的原理自然就知道了为什么会有这么个东西。我们知道java中接口是不可以直接创建实例的,那么问题来了,假如…

[Java]什么是接口回调?

什么是接口回调? 1.接口回调是什么[2]? 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现…

自定义动画animate

开发工具与关键技术:VS,MVC 作者:陈梅 撰写时间:2019年6月2 日 所有代码来源与老师教学 这次分享一个好玩的自定义动画效果,这次还是用jQuery做出来的小功能。这次我们先直接看最后已经布局好的效果。 把所想写的内容…

Android自定义动画专题一

Android自定义动画 在目前的移动端产品中,不管是app还是网页一个好看酷炫的页面总是会第一时间吸引人的眼球,那么对于android开发人员来说,要想实现一个好看的页面必然需要掌握自定义控件以及自定义动画这门技术。 1.Android原生动画 Androi…

百度地图添加自定义图标标注以及自定义动画效果

百度地图添加自定义图标标注以及自定义动画效果 1、添加自定义图标标注2、添加自定义动画效果2.1、标注对象marker的构成2.2、自定义动画效果实现过程2.3、最终实现效果 上次写的是添加自定义图标,但是用的是添加自定义覆盖物方法,结果不支持点聚合&…

Vue中如何进行自定义动画与动画效果设计

Vue中如何进行自定义动画与动画效果设计 在Vue中,动画效果是非常有用的,它可以使用户界面变得更加生动、有趣,从而提高用户体验。Vue提供了一套非常方便的动画系统,使得我们可以非常容易地实现动画效果。 在本文中,我…

Android 自定义动画(实现类似分享动画)

最近在开发app中,要实现点击进入分享动画页面,然后照着每个Item的功能,来实现各自的功能 效果图如下: 首选自定义动画Activity import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import andr…

UE4 创建自定义动画节点

创建自定义动画节点需要两个类: 一个是您在编辑器中看到的图表节点 一个是真正在运行时工作的行为节点 动画图表节点,派生自:UAnimGraphNode_Base 例如:class UAnimGraphNode_SequencePlayer : public UAnimGraphNode_Base 动画…

ViewPager2添加自定义动画

此篇为ViewPager2的拓展篇,具体可查看ViewPager2的使用 ViewPager2自定义动画的核心是使用PageTransformer来实现,他是ViewPager2中的一个接口 原理 要显示非默认屏幕滑动动画,请实现 ViewPager2.PageTransformer 接口并将其提供给 ViewPa…

jQuery(五)--自定义动画、动画

目录 一、自定义动画 1.1 animate() 1.2 animate()动画执行顺序 1.3 animate()动画回调函数和匀速运动 1.4 animate动画之stop()/delay() 二、动画 2.1 show()/hide()/toggle() 2.2 slideDown()/slideUp()/slideToggle() 2.3 fadeIn()/fadeOut()/fadeTo()/fadeToggle(…

Android ProgressBar 自定义动画

源码地址&#xff1a; https://download.csdn.net/download/dreams_deng/12236355 1. 自定义圆形动画 1.1 布局 <!-- indeterminateDrawable 旋转图片indeterminateDuration 旋转速度--><ProgressBarandroid:id"id/pb_welcome_loading"android:layout_…