Bonding (împerechere) în Bluetooth Low Energy este procesul de creare a unei conexiuni securizate permanente între două dispozitive cu păstrarea cheilor criptografice în memoria nevolatilă. După bonding, dispozitivele pot restabili automat conexiunea criptată la reconectare fără reintroducerea PIN-ului sau confirmarea utilizatorului. Conform Bluetooth SIG Core Specification v5.4 (2025), mecanismul bonding este obligatoriu pentru dispozitivele care necesită reconectare automată — căști, trackere de fitness, senzori medicali și accesorii IoT.
Principalele puncte
Bonding — este o extensie a procesului de pairing în Bluetooth Low Energy, în care dispozitivele salvează cheile de criptare pentru conexiunile ulterioare. Standardul BLE definește trei moduri de securitate: Security Mode 1 (criptare fără autentificare), Security Mode 2 (semnarea datelor fără criptare) și Security Mode 3 (criptare cu autentificare). Bonding este relevant pentru modurile cu criptare care necesită conexiuni multiple fără renegocierea cheilor.
Scopul principal al bondingului este restabilirea automată a conexiunii criptate la reconectarea dispozitivelor. Când utilizatorul scoate căștile din carcasă și le pune, bonding asigură conectarea instantanee la smartphone fără a fi nevoie să selecteze din nou dispozitivul în meniul Bluetooth. Conform Apple Bluetooth Design Guidelines (2025), dispozitivele bonded trebuie să se conecteze în cel mult 2 secunde de la detectare.
În timpul bondingului, fiecare dispozitiv salvează un set de materiale criptografice: Long Term Key (LTK) pentru criptarea conexiunii, Identity Resolving Key (IRK) pentru rezolvarea adreselor aleatoare, Connection Signature Resolving Key (CSRK) pentru verificarea semnăturilor datelor. LTK — cheia principală de 128 de biți, generată în procesul de pairing și utilizată pentru toate sesiunile criptate ulterioare.
| Cheie | Lungime | Scop |
|---|---|---|
| LTK | 128 biți | Criptarea datelor după reconectare |
| IRK | 128 biți | Rezolvarea adreselor private aleatoare (RPA) |
| CSRK | 128 biți | Semnarea și verificarea autenticității datelor |
Pairing — este acordul temporar al cheilor pentru criptarea sesiunii curente de comunicare. Când conexiunea se încheie, cheile de criptare sunt șterse, iar la următoarea conectare este necesar un proces repetat de pairing. Bonding include toate etapele pairingului, dar în plus salvează cheile pentru sesiunile ulterioare. Practic toate dispozitivele Bluetooth de consum (căști, difuzoare, ceasuri) folosesc bonding, deoarece fără el fiecare conectare ar necesita reintroducerea PIN-ului.
Procesul de pairing conform specificației BLE constă din trei faze. Faza 1 — schimbul de capacități ale dispozitivelor (IO capabilities, suport pentru autentificare). Faza 2 — generarea și schimbul Short Term Key (STK) sau LTK, în funcție de metoda de conectare. Faza 3 — transportul cheilor: schimbul LTK, IRK, CSRK între dispozitive. Dacă dispozitivele au salvat cheile după Faza 3 — acesta este bonding. Dacă nu — este doar pairing.
| Parametru | Pairing | Bonding |
|---|---|---|
| Stocarea cheilor | Nu se salvează | Se salvează în NVRAM |
| Conectare automată | Nu | Da |
| Reintroducerea PIN | Necesară | Nu este necesară |
| Utilizare | Conexiuni sporadice | Dispozitive permanente |
Procesul de bonding este inițiat după finalizarea cu succes a pairingului, când unul dintre dispozitive trimite o cerere de salvare a cheilor. În BLE, Central (de obicei smartphone) și Peripheral (dispozitiv purtabil) fac schimb de chei printr-un canal securizat stabilit în Faza 2. După schimbul reușit de chei, fiecare dispozitiv le salvează în memoria nevolatilă împreună cu adresa MAC sau Identity Address a partenerului.
Pe partea Central (iOS/Android), cheile sunt stocate în depozitul de sistem Bluetooth. iOS utilizează stiva de sistem Core Bluetooth cu gestionare automată a bondingului: la prima conectare, cheile sunt salvate în NVRAM-ul dispozitivului, iar conexiunile ulterioare la același Peripheral au loc automat. Dezvoltatorul nu gestionează cheile direct — stiva de sistem Core Bluetooth procesează bondingul automat la stabilirea conexiunii cu un dispozitiv care suportă salvarea cheilor.
La reconectare, Peripheral trimite pachete de publicitate care conțin fie adresa sa publică, fie Resolvable Private Address (RPA). Central primește pachetul, potrivește adresa cu dispozitivele bonded salvate și, dacă găsește o potrivire, inițiază restabilirea sesiunii folosind LTK-ul salvat. Dacă LTK se potrivește — conexiunea criptată se stabilește fără un pairing repetat.
Specificația BLE definește mai multe metode de autentificare care influențează nivelul de securitate al bondingului. Alegerea metodei depinde de capacitățile IO ale dispozitivelor — prezența ecranului, tastaturii, posibilitatea de confirmare a comparației numerice. Bondingul sigur necesită utilizarea unei metode nu mai mici de Just Works pentru aplicațiile necritice și Numeric Comparison sau Passkey Entry pentru sarcinile care necesită protecție împotriva atacurilor Man-in-the-Middle.
Just Works — metodă fără autentificare, utilizată când unul dintre dispozitive nu are ecran sau tastatură. Cheile de criptare sunt transmise fără verificarea autenticității celui de-al doilea dispozitiv — temperatură, puls). Just Works este vulnerabil la atacurile MITM, de aceea se aplică doar dispozitivelor unde compromiterea datelor nu reprezintă o amenințare.
Numeric Comparison — metodă de autentificare în care ambele dispozitive afișează un număr de șase cifre, iar utilizatorul trebuie să confirme potrivirea. Această metodă asigură protecție împotriva atacurilor MITM și este recomandată pentru dispozitivele cu ecran — ceasuri inteligente, trackere de fitness, telecomenzi. După confirmare, bondingul se salvează cu nivelul maxim de încredere.
Passkey Entry necesită introducerea unui cod PIN de șase cifre pe unul dintre dispozitive. De obicei, codul este generat de un dispozitiv și afișat pe acesta, iar utilizatorul îl introduce pe cel de-al doilea. Metoda se aplică dispozitivelor medicale și încuietorilor IoT unde este necesar un nivel ridicat de securitate, dar unul dintre dispozitive nu are ecran pentru Numeric Comparison.
Gestionarea bondingului — procesul de vizualizare, ștergere și întreținere a cheilor salvate ale dispozitivelor împărcheate. În dezvoltarea mobilă, este importantă gestionarea corectă a stărilor dispozitivelor bonded, în special la resetarea setărilor dispozitivului periferic sau înlocuirea firmware-ului acestuia. La modificarea cheilor de bonding pe Peripheral, este necesară ștergerea cheilor vechi pe Central și efectuarea unei noi împărcheri.
iOS gestionează automat dispozitivele bonded prin stiva de sistem Core Bluetooth. Dezvoltatorul nu are API direct pentru vizualizarea sau ștergerea dispozitivelor bonded individuale — gestionarea se face prin setările de sistem (Settings > Bluetooth > dispozitiv > Forget). Dacă este necesară curățarea programatică a bondingului, aplicația poate redirecționa utilizatorul către setările de sistem Bluetooth folosind UIApplication.openSettingsURLString.
Android oferă API direct pentru lucrul cu dispozitivele bonded prin clasa BluetoothAdapter. Metoda getBondedDevices() returnează Set<BluetoothDevice> al tuturor dispozitivelor împărcheate. Pentru ștergerea bondingului se utilizează metoda removeBond() prin reflecție sau în Android 12+ API-ul oficial BluetoothDevice.removeBond().
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}
Implementarea bondingului pe partea Android necesită gestionarea corectă a BroadcastReceiver pentru evenimentele BluetoothDevice.ACTION_BOND_STATE_CHANGED. La prima conectare la dispozitiv, sistemul Android inițiază automat bondingul, dacă dispozitivul suportă această capacitate. Dezvoltatorul trebuie să gestioneze trei stări: BOND_NONE (neîmpărcheat), BOND_BONDING (proces de împărchere), BOND_BONDED (împărcheat).
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 șters")
}
}
}
Pentru a iniția bondingul în Android, trebuie apelată metoda createBond() pe obiectul BluetoothDevice. Metoda returnează un boolean — true, dacă procesul de împărchere a fost pornit cu succes. Îpând cu Android 12, createBond() necesită permisiunea BLUETOOTH_CONNECT și poate fi respins de sistem dacă aplicația nu are acces de fundal la Bluetooth.
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "Bonding inițiat", Toast.LENGTH_SHORT)
}
}
}
Dezvoltatorii de aplicații mobile se confruntă adesea cu erori tipice la lucrul cu bondingul dispozitivelor BLE. Gestionarea incorectă a stărilor bondingului poate duce la eșecuri de conectare, imposibilitatea reîmpărcherii sau pierderea datelor. Să examinăm cele mai frecvente probleme și soluțiile lor.
După actualizarea firmware-ului dispozitivului BLE, cheile sale de bonding pot fi resetate, dar smartphone-ul continuă să stocheze cheile învechite (stale bonding). La încercarea de conectare, Central încearcă să restabilească sesiunea cu LTK-ul vechi, Peripheral respinge cheia, iar conexiunea nu se stabilește. Soluția — ștergeți bondingul pe smartphone prin Settings > Bluetooth > Forget Device și efectuați o nouă împărchere.
Cipurile BLE au o limitare a numărului de înregistrări de bonding salvate. Pentru cipurile populare Nordic nRF5x, limita este de 8–20 de înregistrări, în funcție de configurație. La depășirea limitei, dispozitivul nu mai acceptă noi împărcheri. Soluția — ștergeți înregistrările de bonding neutilizate sau folosiți un lanț de chei cu curățare prioritară.
La utilizarea Privacy Feature (adrese MAC aleatoare), dispozitivul își schimbă periodic adresa. Dacă Central nu a salvat IRK-ul, nu poate potrivi noua adresă aleatoare cu un dispozitiv cunoscut. Soluția — implementați corect stocarea IRK și utilizați-l pentru rezolvarea RPA la fiecare detectare a dispozitivului.
Întrebări frecvente
Bonding în Bluetooth Low Energy — procesul de salvare a cheilor de criptare (LTK, IRK, CSRK) după încheierea sesiunii de pairing pentru restabilirea automată a conexiunii securizate la conexiunile ulterioare fără reintroducerea PIN-ului sau confirmare.
Pairing — acordul temporar al cheilor pentru sesiunea curentă, care sunt șterse la încheierea conexiunii. Bonding include procesul complet de pairing plus salvarea cheilor pentru conexiunile viitoare. Bonding este necesar pentru dispozitivele care se conectează automat — căști, ceasuri, trackere de fitness.
Pe iPhone, ștergerea bondingului se face prin setările de sistem: Settings > Bluetooth > apăsați pictograma de informații (i) lângă dispozitiv > selectați Forget This Device. După aceasta, cheile de criptare sunt șterse, iar la următoarea conectare va fi necesară o nouă împărchere.
Numărul de dispozitive bonded depinde de volumul memoriei nevolatile a cipului BLE. Smartphone-urile pot stoca sute de înregistrări, în timp ce dispozitivele periferice BLE bugetare sunt limitate la 8–20 de înregistrări. La depășirea limitei, înregistrările vechi sunt suprascrise sau dispozitivul nu mai acceptă noi împărcheri.
Stale bonding — situația în care cheile de criptare de pe un dispozitiv (de obicei Peripheral) au fost resetate (de exemplu, la reflashing), iar pe Central au rămas cheile vechi. Drept urmare, conexiunea nu se stabilește până când utilizatorul nu șterge bondingul învechit prin setările Bluetooth și nu efectuează o nouă împărchere.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și