Bonding(绑定)在蓝牙低功耗中是指在两个设备之间创建持久安全连接的过程,将加密密钥存储在非易失性存储器中。绑定后,设备可以在重新连接时自动恢复加密连接,无需重新输入PIN或用户确认。根据Bluetooth SIG Core Specification v5.4(2025),绑定机制对于需要自动重新连接的设备是必需的——耳机、健身追踪器、医疗传感器和IoT配件。
要点
Bonding——是蓝牙低功耗中配对过程的扩展,设备在此过程中保存加密密钥以供后续连接使用。BLE标准定义了三种安全模式:Security Mode 1(无身份验证的加密)、Security Mode 2(无加密的数据签名)和Security Mode 3(带身份验证的加密)。Bonding适用于需要加密的模式,当需要多次连接而无需重新协商密钥时。
绑定的主要目的是在设备重新连接时自动恢复加密连接。当用户从充电盒中取出耳机并佩戴时,绑定可确保立即连接到智能手机,无需在蓝牙菜单中重新选择设备。根据Apple Bluetooth Design Guidelines(2025),已配对设备应在检测到后2秒内完成连接。
在绑定时,每个设备保存一组加密材料:用于连接加密的Long Term Key(LTK)、用于解析随机地址的Identity Resolving Key(IRK)、用于验证数据签名的Connection Signature Resolving Key(CSRK)。LTK是长度为128位的主密钥,在配对过程中生成并用于所有后续加密会话。
| 密钥 | 长度 | 用途 |
|---|---|---|
| LTK | 128位 | 重新连接后的数据加密 |
| IRK | 128位 | 解析随机私有地址(RPA) |
| CSRK | 128位 | 数据签名和真实性验证 |
Pairing——是为加密当前通信会话而进行的临时密钥协商。当连接终止时,加密密钥被删除,下次连接时需要重新进行配对过程。Bonding包括配对的所有阶段,但额外保存密钥以供后续会话使用。几乎所有消费类蓝牙设备(耳机、扬声器、手表)都使用绑定,因为没有它,每次连接都需要重新输入PIN码。
根据BLE规范,配对过程由三个阶段组成。阶段1——设备能力交换(IO capabilities、身份验证支持)。阶段2——生成和交换Short Term Key(STK)或LTK,取决于配对方法。阶段3——密钥传输:设备之间交换LTK、IRK、CSRK。如果设备在阶段3之后保存了密钥——这就是绑定。如果没有——这仅仅是配对。
| 参数 | Pairing | Bonding |
|---|---|---|
| 密钥存储 | 不保存 | 保存在NVRAM中 |
| 自动连接 | 否 | 是 |
| 重新输入PIN | 需要 | 不需要 |
| 用途 | 临时连接 | 永久设备 |
绑定过程在配对成功完成后启动,此时其中一个设备发送保存密钥的请求。在BLE中,Central(通常是智能手机)和Peripheral(可穿戴设备)通过在阶段2建立的加密通道交换密钥。成功交换密钥后,每个设备将密钥连同伙伴的MAC地址或标识地址一起存储在非易失性存储器中。
在Central端(iOS/Android),密钥存储在系统蓝牙存储中。iOS使用Core Bluetooth系统栈进行自动绑定管理:首次配对时,密钥保存在设备的NVRAM中,随后连接到同一Peripheral会自动进行。开发人员不直接管理密钥——Core Bluetooth系统栈在建立连接时自动处理支持密钥保存的设备的绑定。
在重新连接时,Peripheral发送包含其公共地址或可解析私有地址(RPA)的广播包。Central接收数据包,将地址与已保存的已配对设备进行匹配,如果找到匹配项,则使用保存的LTK启动会话恢复。如果LTK匹配——加密连接建立,无需重新配对。
BLE规范定义了多种身份验证方法,这些方法影响绑定的安全级别。方法的选择取决于设备的IO capabilities——是否具有显示屏、键盘、数字比较确认能力。安全的绑定要求对于非关键应用至少使用Just Works方法,对于需要防止中间人攻击的任务使用Numeric Comparison或Passkey Entry。
Just Works——无身份验证方法,用于当其中一个设备没有显示屏或键盘时。加密密钥在未验证第二设备身份的情况下传输——温度计、脉搏血氧仪)。Just Works容易受到MITM攻击,因此仅用于数据泄露不构成威胁的设备。
Numeric Comparison——身份验证方法,两个设备都显示一个六位数字,用户必须确认匹配。此方法提供MITM攻击保护,推荐用于带显示屏的设备——智能手表、健身追踪器、遥控器。确认后,绑定以最高信任级别保存。
Passkey Entry需要在其中一个设备上输入六位PIN码。通常代码由一个设备生成并显示在其上,而用户在第二个设备上输入。此方法用于医疗设备和IoT锁,需要高安全级别但其中一个设备没有显示屏来进行Numeric Comparison。
绑定管理——是查看、删除和维护已配对设备保存密钥的过程。在移动开发中,正确处理已配对设备的状态很重要,尤其是在外围设备恢复出厂设置或更换固件时。当Peripheral上的绑定密钥发生变化时,需要在Central上删除旧密钥并重新配对。
iOS通过系统Core Bluetooth栈自动管理已配对设备。开发人员没有直接的API来查看或删除单个已配对设备——管理通过系统设置进行(Settings > Bluetooth > 设备 > Forget)。如果需要以编程方式清除绑定,应用程序可以使用UIApplication.openSettingsURLString将用户引导至系统蓝牙设置。
Android通过BluetoothAdapter类提供直接处理已配对设备的API。方法getBondedDevices()返回所有已配对设备的Set<BluetoothDevice>。删除绑定使用通过反射调用的removeBond()方法,或Android 12+的官方API BluetoothDevice.removeBond()。
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}
Android端的绑定实现需要正确处理BluetoothDevice.ACTION_BOND_STATE_CHANGED事件的BroadcastReceiver。首次连接到设备时,Android系统会自动启动绑定(如果设备支持此功能)。开发人员需要处理三种状态:BOND_NONE(未配对)、BOND_BONDING(配对中)、BOND_BONDED(已配对)。
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上启动绑定,需要在BluetoothDevice对象上调用createBond()方法。该方法返回boolean——如果配对过程成功启动则返回true。从Android 12开始,createBond()需要BLUETOOTH_CONNECT权限,如果应用程序没有后台蓝牙访问权限,系统可能拒绝该请求。
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "正在启动绑定", Toast.LENGTH_SHORT)
}
}
}
移动应用程序开发人员在使用BLE设备绑定时经常遇到典型错误。不正确的绑定状态处理可能导致连接失败、无法重新配对或数据丢失。让我们看看最常见的问题及其解决方案。
BLE设备固件更新后,其绑定密钥可能被重置,但智能手机继续存储过时的密钥(过期绑定)。尝试连接时,Central尝试使用旧LTK恢复会话,Peripheral拒绝该密钥,连接无法建立。解决方案——通过Settings > Bluetooth > Forget Device在智能手机上删除绑定并重新配对。
BLE芯片对保存的绑定记录数量有限制。对于流行的Nordic nRF5x芯片,限制为8-20条记录,取决于配置。超过限制后,设备停止接受新的配对。解决方案——删除不使用的绑定记录或使用具有优先清理功能的密钥系统。
使用隐私功能(随机MAC地址)时,设备会定期更改其地址。如果Central没有保存IRK,它无法将新的随机地址与已知设备关联。解决方案——正确实现IRK存储,并在每次检测到设备时使用它来解析RPA。
常见问题
Bonding在蓝牙低功耗中——是在配对会话结束后保存加密密钥(LTK、IRK、CSRK)的过程,用于在后续连接时自动恢复安全连接,无需重新输入PIN或确认。
Pairing——是为当前会话临时协商的密钥,在连接断开时被删除。Bonding包括完整的配对过程加上为未来连接保存密钥。需要自动重新连接的设备需要Bonding——耳机、手表、健身追踪器。
在iPhone上,删除绑定通过系统设置进行:Settings > Bluetooth > 点击设备旁边的信息图标(i)> 选择Forget This Device。之后加密密钥被删除,下次连接时需要重新配对。
已配对设备的数量取决于BLE芯片非易失性存储器的大小。智能手机可以存储数百条记录,而低端BLE外设设备限制为8-20条记录。超过限制时,旧记录被覆盖或设备停止接受新的配对。
过期绑定——当一个设备(通常是Peripheral)上的加密密钥被重置(例如在重新刷写固件时)而Central上保留旧密钥的情况。结果,连接无法建立,直到用户通过蓝牙设置删除过期绑定并重新配对。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。