Bonding (сопряжение) в Bluetooth Low Energy — это процесс создания постоянного защищённого соединения между двумя устройствами с сохранением криптографических ключей в энергонезависимой памяти. После bonding устройства могут автоматически восстанавливать шифрованное соединение при повторном подключении без повторного ввода PIN или подтверждения пользователем. По данным Bluetooth SIG Core Specification v5.4 (2025), механизм bonding является обязательным для устройств, требующих автоматического переподключения — наушников, фитнес-трекеров, медицинских датчиков и IoT-аксессуаров.
Главное
Bonding — это расширение процесса pairing в Bluetooth Low Energy, при котором устройства сохраняют ключи шифрования для последующих подключений. Стандарт BLE определяет три режима безопасности: Security Mode 1 (шифрование без аутентификации), Security Mode 2 (подпись данных без шифрования) и Security Mode 3 (шифрование с аутентификацией). Bonding актуален для режимов с шифрованием, когда требуется многократное подключение без повторного согласования ключей.
Основное назначение bonding — автоматическое восстановление шифрованного соединения при повторном подключении устройств. Когда пользователь достаёт наушники из кейса и надевает их, bonding обеспечивает мгновенное подключение к смартфону без необходимости повторного выбора устройства в меню Bluetooth. По данным Apple Bluetooth Design Guidelines (2025), bonded устройства должны подключаться за время не более 2 секунд с момента обнаружения.
При bonding каждое устройство сохраняет набор криптографических материалов: Long Term Key (LTK) для шифрования соединения, Identity Resolving Key (IRK) для разрешения случайных адресов, Connection Signature Resolving Key (CSRK) для проверки подписей данных. LTK — основной ключ длиной 128 бит, генерируемый в процессе pairing и используемый для всех последующих шифрованных сессий.
| Ключ | Длина | Назначение |
|---|---|---|
| LTK | 128 бит | Шифрование данных после повторного подключения |
| IRK | 128 бит | Разрешение случайных приватных адресов (RPA) |
| CSRK | 128 бит | Подпись и проверка подлинности данных |
Pairing — это временное согласование ключей для шифрования текущей сессии связи. Когда соединение завершается, ключи шифрования удаляются, и при следующем подключении требуется повторный процесс pairing. Bonding включает все этапы pairing, но дополнительно сохраняет ключи для последующих сессий. Практически все потребительские Bluetooth-устройства (наушники, колонки, часы) используют bonding, так как без него каждое подключение требовало бы повторного ввода PIN-кода.
Процесс pairing по спецификации BLE состоит из трёх фаз. Фаза 1 — обмен возможностями устройств (IO capabilities, поддержка аутентификации). Фаза 2 — генерация и обмен Short Term Key (STK) или LTK, в зависимости от метода сопряжения. Фаза 3 — транспорт ключей: обмен LTK, IRK, CSRK между устройствами. Если устройства сохранили ключи после Фазы 3 — это bonding. Если нет — это просто pairing.
| Параметр | Pairing | Bonding |
|---|---|---|
| Хранение ключей | Не сохраняются | Сохраняются в NVRAM |
| Автоподключение | Нет | Да |
| Повторный ввод PIN | Требуется | Не требуется |
| Использование | Эпизодические подключения | Постоянные устройства |
Процесс bonding инициируется после успешного завершения pairing, когда одно из устройств отправляет запрос на сохранение ключей. В BLE Central (обычно смартфон) и Peripheral (носимое устройство) обмениваются ключами через защищённый канал, установленный на Фазе 2. После успешного обмена ключами каждое устройство сохраняет их в энергонезависимой памяти вместе с MAC-адресом или Identity Address партнёра.
На стороне Central (iOS/Android) ключи хранятся в системном хранилище Bluetooth. iOS использует системный стек Core Bluetooth с автоматическим управлением bonding: при первом сопряжении ключи сохраняются в NVRAM устройства, и последующие подключения к тому же Peripheral происходят автоматически. Разработчик не управляет ключами напрямую — системный стек Core Bluetooth обрабатывает bonding автоматически при установлении соединения с устройством, которое поддерживает сохранение ключей.
При повторном подключении Peripheral отправляет рекламные пакеты, содержащие либо свой публичный адрес, либо Resolvable Private Address (RPA). Central получает пакет, сопоставляет адрес с сохранёнными bonded устройствами и, если находит совпадение, инициирует восстановление сессии с использованием сохранённого LTK. Если LTK совпадает — шифрованное соединение устанавливается без повторного pairing.
Спецификация BLE определяет несколько методов аутентификации, которые влияют на уровень безопасности bonding. Выбор метода зависит от IO capabilities устройств — наличия дисплея, клавиатуры, возможности подтверждения числового сравнения. Безопасный bonding требует использования метода не ниже Just Works для некритичных применений и Numeric Comparison или Passkey Entry для задач, требующих защиты от Man-in-the-Middle атак.
Just Works — метод без аутентификации, используемый, когда одно из устройств не имеет дисплея или клавиатуры. Ключи шифрования передаются без проверки подлинности второго устройства — температура, пульсометр). Just Works подвержен MITM-атакам, поэтому применяется только для устройств, где компрометация данных не представляет угрозы.
Numeric Comparison — метод аутентификации, при котором оба устройства отображают шестизначное число, и пользователь должен подтвердить совпадение. Этот метод обеспечивает защиту от MITM-атак и рекомендуется для устройств с дисплеем — смарт-часов, фитнес-трекеров, пультов управления. После подтверждения bonding сохраняется с максимальным уровнем доверия.
Passkey Entry требует ввода шестизначного PIN-кода на одном из устройств. Обычно код генерируется одним устройством и отображается на нём, а пользователь вводит его на втором. Метод применяется для медицинских устройств и IoT-замков, где требуется высокий уровень безопасности, но одно из устройств не имеет дисплея для Numeric Comparison.
Управление bonding — это процесс просмотра, удаления и обслуживания сохранённых ключей сопряжённых устройств. В мобильной разработке важно корректно обрабатывать состояния bonded устройств, особенно при сбросе настроек периферийного устройства или замене его прошивки. При изменении bonding-ключей на Peripheral необходимо удалить старые ключи на Central и выполнить повторное сопряжение.
iOS автоматически управляет bonded устройствами через системный Core Bluetooth стек. Разработчик не имеет прямого API для просмотра или удаления отдельных bonded устройств — управление осуществляется через системные настройки (Settings > Bluetooth > устройство > Forget). Если необходимо программно очистить bonding, приложение может отправить пользователя в системные настройки Bluetooth с использованием UIApplication.openSettingsURLString.
Android предоставляет прямой API для работы с bonded устройствами через класс BluetoothAdapter. Метод getBondedDevices() возвращает Set<BluetoothDevice> всех сопряжённых устройств. Для удаления bonding используется метод 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}")
}
Реализация bonding на стороне Android требует корректной обработки BroadcastReceiver для событий BluetoothDevice.ACTION_BOND_STATE_CHANGED. При первом подключении к устройству система Android автоматически инициирует bonding, если устройство поддерживает эту возможность. Разработчик должен обрабатывать три состояния: 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", "Bond removed")
}
}
}
Для инициирования bonding на Android необходимо вызвать метод createBond() на объекте BluetoothDevice. Метод возвращает boolean — true, если процесс сопряжения запущен успешно. Начиная с Android 12, createBond() требует разрешение BLUETOOTH_CONNECT и может быть отклонён системой, если приложение не имеет фонового доступа к Bluetooth.
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "Bonding initiated", Toast.LENGTH_SHORT)
}
}
}
Разработчики мобильных приложений часто сталкиваются с типовыми ошибками при работе с bonding BLE-устройств. Некорректная обработка состояний bonding может привести к сбоям подключения, невозможности повторного сопряжения или потере данных. Рассмотрим наиболее частые проблемы и их решения.
После обновления прошивки BLE-устройства его bonding-ключи могут быть сброшены, но смартфон продолжает хранить устаревшие ключи (stale bonding). При попытке подключения Central пытается восстановить сессию со старым LTK, Peripheral отвергает ключ, и соединение не устанавливается. Решение — удалить bonding на смартфоне через Settings > Bluetooth > Forget Device и выполнить повторное сопряжение.
BLE-чипы имеют ограничение на количество сохраняемых bonding-записей. Для популярных чипов Nordic nRF5x лимит составляет 8-20 записей в зависимости от конфигурации. При превышении лимита устройство перестаёт принимать новые сопряжения. Решение — удалять неиспользуемые bonding-записи или использовать связку ключей с приоритетной очисткой.
При использовании Privacy Feature (случайные MAC-адреса) устройство периодически меняет свой адрес. Если Central не сохранил IRK, он не может сопоставить новый случайный адрес с известным устройством. Решение — правильно реализовать хранение IRK и использовать его для разрешения RPA при каждом обнаружении устройства.
Часто задаваемые вопросы
Bonding в Bluetooth Low Energy — это процесс сохранения ключей шифрования (LTK, IRK, CSRK) после завершения сессии pairing для автоматического восстановления защищённого соединения при последующих подключениях без повторного ввода PIN или подтверждения.
Pairing — это временное согласование ключей для текущей сессии, которые удаляются при разрыве соединения. Bonding включает полный процесс pairing плюс сохранение ключей для будущих подключений. Bonding требуется устройствам, которые автоматически переподключаются — наушникам, часам, фитнес-трекерам.
На iPhone удаление bonding выполняется через системные настройки: Settings > Bluetooth > нажмите значок информации (i) рядом с устройством > выберите Forget This Device. После этого ключи шифрования удаляются, и при следующем подключении потребуется повторное сопряжение.
Количество bonded устройств зависит от объёма энергонезависимой памяти BLE-чипа. Смартфоны могут хранить сотни записей, в то время как бюджетные BLE-периферийные устройства ограничены 8-20 записями. При превышении лимита старые записи перезаписываются или устройство перестаёт принимать новые сопряжения.
Stale bonding — ситуация, когда ключи шифрования на одном устройстве (обычно Peripheral) были сброшены (например, при перепрошивке), а на Central остались старые ключи. В результате соединение не устанавливается до тех пор, пока пользователь не удалит stale bonding через настройки Bluetooth и не выполнит повторное сопряжение.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также