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), свързаните устройства трябва да се свързват за по-малко от 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 адреса или идентификационния адрес на партньора.
От страна на Central (iOS/Android), ключовете се съхраняват в системното хранилище на Bluetooth. iOS използва системния стек Core Bluetooth с автоматично управление на bonding: при първото сдвояване ключовете се запазват в NVRAM на устройството и последващите свързвания към същото Peripheral стават автоматично. Разработчикът не управлява ключовете директно — системният стек Core Bluetooth обработва bonding автоматично при установяване на връзка с устройство, което поддържа запазване на ключове.
При повторно свързване Peripheral изпраща рекламни пакети, съдържащи или публичния си адрес, или Resolvable Private Address (RPA). Central получава пакета, съпоставя адреса със запазени свързани устройства и ако намери съвпадение, инициира възстановяване на сесията с използване на запазения 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 — е процес на преглед, изтриване и поддръжка на запазени ключове на свързани устройства. В мобилната разработка е важно да се обработват правилно състоянията на свързани устройства, особено при нулиране на периферно устройство или подмяна на неговия firmware. При промяна на bonding ключове на Peripheral е необходимо да се изтрият старите ключове на Central и да се извърши повторно сдвояване.
iOS автоматично управлява свързаните устройства чрез системния Core Bluetooth стек. Разработчикът няма пряк API за преглед или изтриване на отделни свързани устройства — управлението се осъществява чрез системните настройки (Settings > Bluetooth > устройство > Forget). Ако е необходимо програмно почистване на bonding, приложението може да изпрати потребителя към системните настройки на Bluetooth с използване на UIApplication.openSettingsURLString.
Android предоставя пряк API за работа със свързани устройства чрез класа 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", "Bonding премахнат")
}
}
}
За иницииране на 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 може да доведе до проблеми със свързването, невъзможност за повторно сдвояване или загуба на данни. Нека разгледаме най-честите проблеми и техните решения.
След актуализация на firmware на 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. След това ключовете за криптиране се изтриват и при следващото свързване ще се изисква повторно сдвояване.
Броят на свързаните устройства зависи от размера на енергонезависимата памет на BLE чипа. Смартфоните могат да съхраняват стотици записи, докато бюджетните BLE периферни устройства са ограничени до 8-20 записа. При превишаване на лимита старите записи се презаписват или устройството спира да приема нови сдвоявания.
Stale bonding — ситуация, при която ключовете за криптиране на едно устройство (обикновено Peripheral) са били нулирани (например при презаписване на firmware), а на Central са останали старите ключове. В резултат на това връзката не се установява, докато потребителят не изтрие stale bonding чрез настройките на Bluetooth и не извърши повторно сдвояване.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също