Bonding:什么是BLE配对过程与安全性

作者: IT Sectr 发布日期: 2026-07-16 阅读时间: 10 分钟

Bonding(绑定)在蓝牙低功耗中是指在两个设备之间创建持久安全连接的过程,将加密密钥存储在非易失性存储器中。绑定后,设备可以在重新连接时自动恢复加密连接,无需重新输入PIN或用户确认。根据Bluetooth SIG Core Specification v5.4(2025),绑定机制对于需要自动重新连接的设备是必需的——耳机、健身追踪器、医疗传感器和IoT配件。

要点

  • Bonding——是在会话结束后在BLE设备之间长期保存加密密钥的过程。
  • pairing不同,绑定允许自动恢复加密连接,无需重新确认。
  • 绑定过程包括密钥交换LTK、IRK、CSRK并将其存储在双方的存储器中。
  • iOS通过Settings > Bluetooth管理已配对设备,并可删除已存储的密钥。
  • 对于Android,通过BluetoothAdapter和API getBondedDevices()进行绑定管理。

BLE中的Bonding是什么?

Bonding——是蓝牙低功耗中配对过程的扩展,设备在此过程中保存加密密钥以供后续连接使用。BLE标准定义了三种安全模式:Security Mode 1(无身份验证的加密)、Security Mode 2(无加密的数据签名)和Security Mode 3(带身份验证的加密)。Bonding适用于需要加密的模式,当需要多次连接而无需重新协商密钥时。

为什么需要Bonding

绑定的主要目的是在设备重新连接时自动恢复加密连接。当用户从充电盒中取出耳机并佩戴时,绑定可确保立即连接到智能手机,无需在蓝牙菜单中重新选择设备。根据Apple Bluetooth Design Guidelines(2025),已配对设备应在检测到后2秒内完成连接。

Bonding保存哪些数据

在绑定时,每个设备保存一组加密材料:用于连接加密的Long Term Key(LTK)、用于解析随机地址的Identity Resolving Key(IRK)、用于验证数据签名的Connection Signature Resolving Key(CSRK)。LTK是长度为128位的主密钥,在配对过程中生成并用于所有后续加密会话。

密钥长度用途
LTK128位重新连接后的数据加密
IRK128位解析随机私有地址(RPA)
CSRK128位数据签名和真实性验证

Bonding与Pairing:有什么区别

Pairing——是为加密当前通信会话而进行的临时密钥协商。当连接终止时,加密密钥被删除,下次连接时需要重新进行配对过程。Bonding包括配对的所有阶段,但额外保存密钥以供后续会话使用。几乎所有消费类蓝牙设备(耳机、扬声器、手表)都使用绑定,因为没有它,每次连接都需要重新输入PIN码。

配对和绑定的三个阶段

根据BLE规范,配对过程由三个阶段组成。阶段1——设备能力交换(IO capabilities、身份验证支持)。阶段2——生成和交换Short Term Key(STK)或LTK,取决于配对方法。阶段3——密钥传输:设备之间交换LTK、IRK、CSRK。如果设备在阶段3之后保存了密钥——这就是绑定。如果没有——这仅仅是配对。

参数PairingBonding
密钥存储不保存保存在NVRAM中
自动连接
重新输入PIN需要不需要
用途临时连接永久设备

Bonding过程如何工作

绑定过程在配对成功完成后启动,此时其中一个设备发送保存密钥的请求。在BLE中,Central(通常是智能手机)和Peripheral(可穿戴设备)通过在阶段2建立的加密通道交换密钥。成功交换密钥后,每个设备将密钥连同伙伴的MAC地址或标识地址一起存储在非易失性存储器中。

Central端的密钥存储

Central端(iOS/Android),密钥存储在系统蓝牙存储中。iOS使用Core Bluetooth系统栈进行自动绑定管理:首次配对时,密钥保存在设备的NVRAM中,随后连接到同一Peripheral会自动进行。开发人员不直接管理密钥——Core Bluetooth系统栈在建立连接时自动处理支持密钥保存的设备的绑定。

通过Bonding恢复连接

在重新连接时,Peripheral发送包含其公共地址或可解析私有地址(RPA)的广播包。Central接收数据包,将地址与已保存的已配对设备进行匹配,如果找到匹配项,则使用保存的LTK启动会话恢复。如果LTK匹配——加密连接建立,无需重新配对。

Bonding中的身份验证方法

BLE规范定义了多种身份验证方法,这些方法影响绑定的安全级别。方法的选择取决于设备的IO capabilities——是否具有显示屏、键盘、数字比较确认能力。安全的绑定要求对于非关键应用至少使用Just Works方法,对于需要防止中间人攻击的任务使用Numeric Comparison或Passkey Entry。

Just Works

Just Works——无身份验证方法,用于当其中一个设备没有显示屏或键盘时。加密密钥在未验证第二设备身份的情况下传输——温度计、脉搏血氧仪)。Just Works容易受到MITM攻击,因此仅用于数据泄露不构成威胁的设备。

Numeric Comparison

Numeric Comparison——身份验证方法,两个设备都显示一个六位数字,用户必须确认匹配。此方法提供MITM攻击保护,推荐用于带显示屏的设备——智能手表、健身追踪器、遥控器。确认后,绑定以最高信任级别保存。

Passkey Entry

Passkey Entry需要在其中一个设备上输入六位PIN码。通常代码由一个设备生成并显示在其上,而用户在第二个设备上输入。此方法用于医疗设备和IoT锁,需要高安全级别但其中一个设备没有显示屏来进行Numeric Comparison。

在iOS和Android中管理已配对设备

绑定管理——是查看、删除和维护已配对设备保存密钥的过程。在移动开发中,正确处理已配对设备的状态很重要,尤其是在外围设备恢复出厂设置或更换固件时。当Peripheral上的绑定密钥发生变化时,需要在Central上删除旧密钥并重新配对。

iOS中的管理

iOS通过系统Core Bluetooth栈自动管理已配对设备。开发人员没有直接的API来查看或删除单个已配对设备——管理通过系统设置进行(Settings > Bluetooth > 设备 > Forget)。如果需要以编程方式清除绑定,应用程序可以使用UIApplication.openSettingsURLString将用户引导至系统蓝牙设置。

Android中的管理

Android通过BluetoothAdapter类提供直接处理已配对设备的API。方法getBondedDevices()返回所有已配对设备的Set<BluetoothDevice>。删除绑定使用通过反射调用的removeBond()方法,或Android 12+的官方API BluetoothDevice.removeBond()。

kotlin
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
    Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}

Bonding实现的实践示例

Android端的绑定实现需要正确处理BluetoothDevice.ACTION_BOND_STATE_CHANGED事件的BroadcastReceiver。首次连接到设备时,Android系统会自动启动绑定(如果设备支持此功能)。开发人员需要处理三种状态:BOND_NONE(未配对)、BOND_BONDING(配对中)、BOND_BONDED(已配对)。

kotlin
val bondReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
        val bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1)
        when (bondState) {
            BluetoothDevice.BOND_BONDED -> Log.d("Bonding", "Bonded: ${device.name}")
            BluetoothDevice.BOND_NONE -> Log.d("Bonding", "绑定已移除")
        }
    }
}

在Android上启动Bonding

要在Android上启动绑定,需要在BluetoothDevice对象上调用createBond()方法。该方法返回boolean——如果配对过程成功启动则返回true。从Android 12开始,createBond()需要BLUETOOTH_CONNECT权限,如果应用程序没有后台蓝牙访问权限,系统可能拒绝该请求。

kotlin
fun initiateBonding(device: BluetoothDevice) {
    if (device.bondState == BluetoothDevice.BOND_NONE) {
        val success = device.createBond()
        if (success) {
            Toast.makeText(context, "正在启动绑定", Toast.LENGTH_SHORT)
        }
    }
}

处理Bonding时的常见错误

移动应用程序开发人员在使用BLE设备绑定时经常遇到典型错误。不正确的绑定状态处理可能导致连接失败、无法重新配对或数据丢失。让我们看看最常见的问题及其解决方案。

Peripheral固件重置和过期绑定

BLE设备固件更新后,其绑定密钥可能被重置,但智能手机继续存储过时的密钥(过期绑定)。尝试连接时,Central尝试使用旧LTK恢复会话,Peripheral拒绝该密钥,连接无法建立。解决方案——通过Settings > Bluetooth > Forget Device在智能手机上删除绑定并重新配对。

已配对设备数量限制

BLE芯片对保存的绑定记录数量有限制。对于流行的Nordic nRF5x芯片,限制为8-20条记录,取决于配置。超过限制后,设备停止接受新的配对。解决方案——删除不使用的绑定记录或使用具有优先清理功能的密钥系统。

隐私功能问题

使用隐私功能(随机MAC地址)时,设备会定期更改其地址。如果Central没有保存IRK,它无法将新的随机地址与已知设备关联。解决方案——正确实现IRK存储,并在每次检测到设备时使用它来解析RPA。

常见问题

BLE中的Bonding是什么?

Bonding在蓝牙低功耗中——是在配对会话结束后保存加密密钥(LTK、IRK、CSRK)的过程,用于在后续连接时自动恢复安全连接,无需重新输入PIN或确认。

Bonding和Pairing有什么区别?

Pairing——是为当前会话临时协商的密钥,在连接断开时被删除。Bonding包括完整的配对过程加上为未来连接保存密钥。需要自动重新连接的设备需要Bonding——耳机、手表、健身追踪器。

如何在iPhone上删除Bonding?

iPhone上,删除绑定通过系统设置进行:Settings > Bluetooth > 点击设备旁边的信息图标(i)> 选择Forget This Device。之后加密密钥被删除,下次连接时需要重新配对。

可以绑定多少个设备?

已配对设备的数量取决于BLE芯片非易失性存储器的大小。智能手机可以存储数百条记录,而低端BLE外设设备限制为8-20条记录。超过限制时,旧记录被覆盖或设备停止接受新的配对。

什么是过期绑定?

过期绑定——当一个设备(通常是Peripheral)上的加密密钥被重置(例如在重新刷写固件时)而Central上保留旧密钥的情况。结果,连接无法建立,直到用户通过蓝牙设置删除过期绑定并重新配对。

总结

  • Bonding——BLE的关键机制,用于自动恢复加密连接而无需重新输入PIN。
  • Pairing和绑定的区别在于密钥保存:配对时密钥持续一个会话,绑定时永久存储。
  • 绑定过程包括三种类型密钥的交换和存储:LTK(加密)、IRK(标识)、CSRK(签名)。
  • Numeric Comparison身份验证方法提供MITM攻击保护,推荐用于带显示屏的设备。
  • iOS通过Core Bluetooth自动管理绑定,Android提供API createBond()和removeBond()。
  • Peripheral固件重新刷写后的过期绑定是常见问题,可通过从蓝牙列表中删除设备解决。
  • 外围BLE芯片上的已配对设备数量限制为8-20条记录,取决于型号。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读