Bonding (parowanie) w Bluetooth Low Energy to proces tworzenia stałego, zabezpieczonego połączenia między dwoma urządzeniami z zachowaniem kluczy kryptograficznych w pamięci nieulotnej. Po bondingowym połączeniu urządzenia mogą automatycznie przywracać szyfrowane połączenie przy ponownym podłączeniu bez ponownego wprowadzania PIN-u lub potwierdzania przez użytkownika. Według Bluetooth SIG Core Specification v5.4 (2025), mechanizm bondingu jest obowiązkowy dla urządzeń wymagających automatycznego ponownego łączenia — słuchawek, trackerów fitness, czujników medycznych i akcesoriów IoT.
Najważniejsze
Bonding — to rozszerzenie procesu pairingu w Bluetooth Low Energy, w którym urządzenia zapisują klucze szyfrowania do późniejszych połączeń. Standard BLE określa trzy tryby bezpieczeństwa: Security Mode 1 (szyfrowanie bez uwierzytelniania), Security Mode 2 (podpisywanie danych bez szyfrowania) i Security Mode 3 (szyfrowanie z uwierzytelnianiem). Bonding jest istotny w trybach z szyfrowaniem, gdy wymagane jest wielokrotne łączenie bez ponownego uzgadniania kluczy.
Głównym przeznaczeniem bondingu jest automatyczne przywracanie szyfrowanego połączenia przy ponownym podłączeniu urządzeń. Gdy użytkownik wyjmuje słuchawki z etui i zakłada je, bonding zapewnia błyskawiczne połączenie ze smartfonem bez konieczności ponownego wybierania urządzenia w menu Bluetooth. Według Apple Bluetooth Design Guidelines (2025), urządzenia z bondingiem powinny łączyć się w czasie nie większym niż 2 sekundy od momentu wykrycia.
Podczas bondingu każde urządzenie zapisuje zestaw materiałów kryptograficznych: Long Term Key (LTK) do szyfrowania połączenia, Identity Resolving Key (IRK) do rozpoznawania losowych adresów, Connection Signature Resolving Key (CSRK) do weryfikacji podpisów danych. LTK — główny klucz o długości 128 bitów, generowany podczas procesu pairingu i używany do wszystkich późniejszych szyfrowanych sesji.
| Klucz | Długość | Przeznaczenie |
|---|---|---|
| LTK | 128 bitów | Szyfrowanie danych po ponownym podłączeniu |
| IRK | 128 bitów | Rozpoznawanie losowych prywatnych adresów (RPA) |
| CSRK | 128 bitów | Podpisywanie i weryfikacja autentyczności danych |
Pairing — to tymczasowe uzgadnianie kluczy do szyfrowania bieżącej sesji komunikacji. Po zakończeniu połączenia klucze szyfrowania są usuwane, a przy następnym podłączeniu wymagany jest ponowny proces pairingu. Bonding obejmuje wszystkie etapy pairingu, ale dodatkowo zapisuje klucze do późniejszych sesji. Praktycznie wszystkie konsumenckie urządzenia Bluetooth (słuchawki, głośniki, zegarki) używają bondingu, ponieważ bez niego każde podłączenie wymagałoby ponownego wprowadzania PIN-u.
Proces pairingu według specyfikacji BLE składa się z trzech faz. Faza 1 — wymiana możliwości urządzeń (IO capabilities, obsługa uwierzytelniania). Faza 2 — generowanie i wymiana Short Term Key (STK) lub LTK, w zależności od metody łączenia. Faza 3 — transport kluczy: wymiana LTK, IRK, CSRK między urządzeniami. Jeśli urządzenia zapisały klucze po Fazie 3 — to jest bonding. Jeśli nie — to zwykły pairing.
| Parametr | Pairing | Bonding |
|---|---|---|
| Przechowywanie kluczy | Nie są zapisywane | Są zapisywane w NVRAM |
| Automatyczne łączenie | Nie | Tak |
| Ponowne wprowadzanie PIN | Wymagane | Nie wymagane |
| Zastosowanie | Połączenia sporadyczne | Urządzenia stałe |
Proces bondingu jest inicjowany po pomyślnym zakończeniu pairingu, gdy jedno z urządzeń wysyła żądanie zapisania kluczy. W BLE Central (zwykle smartfon) i Peripheral (urządzenie noszone) wymieniają się kluczami przez zabezpieczony kanał ustanowiony w Fazie 2. Po pomyślnej wymianie kluczy każde urządzenie zapisuje je w pamięci nieulotnej wraz z adresem MAC lub Identity Address partnera.
Po stronie Central (iOS/Android) klucze są przechowywane w systemowym magazynie Bluetooth. iOS używa systemowego stosu Core Bluetooth z automatycznym zarządzaniem bondingiem: przy pierwszym łączeniu klucze są zapisywane w NVRAM urządzenia, a kolejne połączenia z tym samym Peripheral odbywają się automatycznie. Deweloper nie zarządza kluczami bezpośrednio — systemowy stos Core Bluetooth obsługuje bonding automatycznie podczas nawiązywania połączenia z urządzeniem, które obsługuje zapisywanie kluczy.
Przy ponownym podłączeniu Peripheral wysyła pakiety reklamowe zawierające albo swój publiczny adres, albo Resolvable Private Address (RPA). Central odbiera pakiet, dopasowuje adres do zapisanych urządzeń z bondingiem i, jeśli znajdzie dopasowanie, inicjuje przywrócenie sesji z użyciem zapisanego LTK. Jeśli LTK jest zgodny — szyfrowane połączenie zostaje ustanowione bez ponownego pairingu.
Specyfikacja BLE określa kilka metod uwierzytelniania, które wpływają na poziom bezpieczeństwa bondingu. Wybór metody zależy od możliwości IO urządzeń — obecności wyświetlacza, klawiatury, możliwości potwierdzenia porównania numerycznego. Bezpieczny bonding wymaga użycia metody co najmniej Just Works dla niekrytycznych zastosowań oraz Numeric Comparison lub Passkey Entry dla zadań wymagających ochrony przed atakami Man-in-the-Middle.
Just Works — metoda bez uwierzytelniania, używana gdy jedno z urządzeń nie ma wyświetlacza ani klawiatury. Klucze szyfrowania są przesyłane bez weryfikacji autentyczności drugiego urządzenia — temperatura, pulsometr). Just Works jest podatna na ataki MITM, dlatego stosuje się ją tylko w urządzeniach, gdzie kompromitacja danych nie stanowi zagrożenia.
Numeric Comparison — metoda uwierzytelniania, w której oba urządzenia wyświetlają sześciocyfrową liczbę, a użytkownik musi potwierdzić zgodność. Ta metoda zapewnia ochronę przed atakami MITM i jest zalecana dla urządzeń z wyświetlaczem — smartwatchy, trackerów fitness, pilotów zdalnego sterowania. Po potwierdzeniu bonding jest zapisywany z maksymalnym poziomem zaufania.
Passkey Entry wymaga wprowadzenia sześciocyfrowego PIN-u na jednym z urządzeń. Zazwyczaj kod jest generowany przez jedno urządzenie i wyświetlany na nim, a użytkownik wprowadza go na drugim. Metoda jest stosowana dla urządzeń medycznych i zamków IoT, gdzie wymagany jest wysoki poziom bezpieczeństwa, ale jedno z urządzeń nie ma wyświetlacza do Numeric Comparison.
Zarządzanie bondingiem — to proces przeglądania, usuwania i utrzymywania zapisanych kluczy sparowanych urządzeń. W programowaniu mobilnym ważne jest prawidłowe obsługiwanie stanów urządzeń z bondingiem, szczególnie przy resetowaniu ustawień urządzenia peryferyjnego lub wymianie jego oprogramowania. W przypadku zmiany kluczy bondingu na Peripheral należy usunąć stare klucze na Central i ponownie przeprowadzić łączenie.
iOS automatycznie zarządza urządzeniami z bondingiem przez systemowy stos Core Bluetooth. Deweloper nie ma bezpośredniego API do przeglądania lub usuwania poszczególnych urządzeń z bondingiem — zarządzanie odbywa się przez ustawienia systemowe (Settings > Bluetooth > urządzenie > Forget). Jeśli konieczne jest programowe czyszczenie bondingu, aplikacja może przekierować użytkownika do ustawień systemowych Bluetooth za pomocą UIApplication.openSettingsURLString.
Android udostępnia bezpośrednie API do pracy z urządzeniami z bondingiem przez klasę BluetoothAdapter. Metoda getBondedDevices() zwraca Set<BluetoothDevice> wszystkich sparowanych urządzeń. Do usuwania bondingu używa się metody removeBond() przez refleksję lub w Android 12+ oficjalne 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}")
}
Implementacja bondingu po stronie Android wymaga prawidłowej obsługi BroadcastReceiver dla zdarzeń BluetoothDevice.ACTION_BOND_STATE_CHANGED. Przy pierwszym podłączeniu do urządzenia system Android automatycznie inicjuje bonding, jeśli urządzenie obsługuje tę możliwość. Deweloper musi obsługiwać trzy stany: BOND_NONE (nie sparowane), BOND_BONDING (proces łączenia), BOND_BONDED (sparowane).
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 usunięty")
}
}
}
Aby zainicjować bonding w Android, należy wywołać metodę createBond() na obiekcie BluetoothDevice. Metoda zwraca boolean — true, jeśli proces łączenia został uruchomiony pomyślnie. Od Androida 12, createBond() wymaga uprawnienia BLUETOOTH_CONNECT i może być odrzucona przez system, jeśli aplikacja nie ma dostępu tłowego do Bluetooth.
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "Bonding zainicjowany", Toast.LENGTH_SHORT)
}
}
}
Deweloperzy aplikacji mobilnych często spotykają się z typowych błędami przy pracy z bondingiem urządzeń BLE. Nieprawidłowa obsługa stanów bondingu może prowadzić do problemów z łączeniem, braku możliwości ponownego parowania lub utraty danych. Omówmy najczęstsze problemy i ich rozwiązania.
Po aktualizacji oprogramowania urządzenia BLE jego klucze bondingu mogą zostać zresetowane, ale smartfon nadal przechowuje nieaktualne klucze (stale bonding). Przy próbie podłączenia Central próbuje przywrócić sesję ze starym LTK, Peripheral odrzuca klucz i połączenie nie zostaje nawiązane. Rozwiązanie — usuń bonding na smartfonie przez Ustawienia > Bluetooth > Zapomnij urządzenie i wykonaj ponowne parowanie.
Układy BLE mają ograniczenie liczby zapisanych wpisów bondingu. Dla popularnych układów Nordic nRF5x limit wynosi 8–20 wpisów w zależności od konfiguracji. Po przekroczeniu limitu urządzenie przestaje przyjmować nowe połączenia. Rozwiązanie — usuwaj nieużywane wpisy bondingu lub używaj wiązki kluczy z priorytetowym czyszczeniem.
Przy użyciu Privacy Feature (losowe adresy MAC) urządzenie okresowo zmienia swój adres. Jeśli Central nie zapisał IRK, nie może dopasować nowego losowego adresu do znanego urządzenia. Rozwiązanie — prawidłowo zaimplementuj przechowywanie IRK i używaj go do rozpoznawania RPA przy każdym wykryciu urządzenia.
Często zadawane pytania
Bonding w Bluetooth Low Energy — to proces zapisywania kluczy szyfrowania (LTK, IRK, CSRK) po zakończeniu sesji pairingu w celu automatycznego przywracania zabezpieczonego połączenia przy kolejnych podłączeniach bez ponownego wprowadzania PIN-u lub potwierdzania.
Pairing — to tymczasowe uzgadnianie kluczy dla bieżącej sesji, które są usuwane po zakończeniu połączenia. Bonding obejmuje pełny proces pairingu oraz zapisywanie kluczy do przyszłych połączeń. Bonding jest wymagany dla urządzeń, które łączą się automatycznie — słuchawek, zegarków, trackerów fitness.
Na iPhonie usunięcie bondingu wykonuje się przez ustawienia systemowe: Settings > Bluetooth > kliknij ikonę informacji (i) obok urządzenia > wybierz Forget This Device. Po tym klucze szyfrowania są usuwane, a przy następnym podłączeniu wymagane będzie ponowne parowanie.
Liczba urządzeń z bondingiem zależy od ilości pamięci nieulotnej układu BLE. Smartfony mogą przechowywać setki wpisów, podczas gdy budżetowe urządzenia peryferyjne BLE są ograniczone do 8–20 wpisów. Po przekroczeniu limitu stare wpisy są nadpisywane lub urządzenie przestaje przyjmować nowe połączenia.
Stale bonding — sytuacja, gdy klucze szyfrowania na jednym urządzeniu (zwykle Peripheral) zostały zresetowane (np. przy zmianie oprogramowania), a na Central pozostały stare klucze. W rezultacie połączenie nie zostaje nawiązane, dopóki użytkownik nie usunie nieaktualnego bondingu przez ustawienia Bluetooth i nie wykona ponownego parowania.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również