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 видалено")
}
}
}
Для ініціювання 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 ініційовано", 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також