Bonding (abbinamento) in Bluetooth Low Energy è il processo di creazione di una connessione sicura permanente tra due dispositivi mediante l’archiviazione di chiavi crittografiche in memoria non volatile. Dopo il bonding, i dispositivi possono ripristinare automaticamente una connessione crittografata alla riconnessione senza dover reinserire il PIN o la conferma dell’utente. Secondo la Bluetooth SIG Core Specification v5.4 (2025), il meccanismo di bonding è obbligatorio per i dispositivi che richiedono la riconnessione automatica — cuffie, tracker fitness, sensori medici e accessori IoT.
Punti chiave
Bonding è un’estensione del processo di pairing in Bluetooth Low Energy, in cui i dispositivi archiviano chiavi di crittografia per connessioni successive. Lo standard BLE definisce tre modalità di sicurezza: Security Mode 1 (crittografia senza autenticazione), Security Mode 2 (firma dei dati senza crittografia) e Security Mode 3 (crittografia con autenticazione). Il bonding è rilevante per le modalità con crittografia dove sono necessarie connessioni ripetute senza rinnovo delle chiavi.
Lo scopo principale del bonding è il ripristino automatico delle connessioni crittografate quando i dispositivi si riconnettono. Quando un utente toglie gli auricolari dalla custodia e li indossa, il bonding garantisce una connessione immediata allo smartphone senza dover selezionare nuovamente il dispositivo dal menu Bluetooth. Secondo le Apple Bluetooth Design Guidelines (2025), i dispositivi associati devono connettersi entro non più di 2 secondi dal rilevamento.
Durante il bonding, ogni dispositivo archivia un insieme di materiali crittografici: Long Term Key (LTK) per la crittografia della connessione, Identity Resolving Key (IRK) per risolvere gli indirizzi casuali e Connection Signature Resolving Key (CSRK) per verificare le firme dei dati. LTK è la chiave primaria a 128 bit generata durante il pairing e utilizzata per tutte le successive sessioni crittografate.
| Chiave | Lunghezza | Scopo |
|---|---|---|
| LTK | 128 bit | Crittografia dei dati dopo la riconnessione |
| IRK | 128 bit | Risoluzione degli indirizzi privati casuali (RPA) |
| CSRK | 128 bit | Firma e verifica dell’autenticità dei dati |
Pairing è la negoziazione temporanea di chiavi per crittografare la sessione di comunicazione corrente. Quando la connessione termina, le chiavi di crittografia vengono eliminate e la connessione successiva richiede un nuovo processo completo di pairing. Bonding include tutte le fasi del pairing ma archivia inoltre le chiavi per sessioni future. Praticamente tutti i dispositivi Bluetooth di consumo (cuffie, altoparlanti, orologi) utilizzano il bonding perché senza di esso, ogni connessione richiederebbe il reinserimento del PIN.
Il processo di pairing secondo la specifica BLE consiste in tre fasi. Fase 1 — scambio delle capacità del dispositivo (capacità IO, supporto all’autenticazione). Fase 2 — generazione e scambio di Short Term Key (STK) o LTK, a seconda del metodo di abbinamento. Fase 3 — trasporto delle chiavi: scambio di LTK, IRK, CSRK tra i dispositivi. Se i dispositivi hanno archiviato le chiavi dopo la Fase 3 — questo è bonding. Se no — è semplicemente pairing.
| Parametro | Pairing | Bonding |
|---|---|---|
| Archiviazione chiavi | Non archiviate | Archiviate in NVRAM |
| Riconnessione automatica | No | Sì |
| Reinserimento PIN | Richiesto | Non richiesto |
| Utilizzo | Connessioni occasionali | Dispositivi permanenti |
Il processo di bonding viene avviato dopo il completamento con successo del pairing, quando un dispositivo invia una richiesta di archiviazione delle chiavi. In BLE, il Central (di solito uno smartphone) e il Peripheral (dispositivo indossabile) scambiano chiavi attraverso il canale sicuro stabilito nella Fase 2. Dopo il riuscito scambio di chiavi, ogni dispositivo le archivia in memoria non volatile insieme all’indirizzo MAC o all’Identity Address del partner.
Sul lato Central (iOS/Android), le chiavi vengono archiviate nell’archivio Bluetooth di sistema. iOS utilizza lo stack di sistema Core Bluetooth con gestione automatica del bonding: al primo abbinamento, le chiavi vengono salvate nella NVRAM del dispositivo e le connessioni successive allo stesso Peripheral avvengono automaticamente. Lo sviluppatore non gestisce le chiavi direttamente — lo stack di sistema Core Bluetooth gestisce il bonding automaticamente quando si connette a un dispositivo che supporta l’archiviazione delle chiavi.
Alla riconnessione, il Peripheral invia pacchetti pubblicitari contenenti il suo indirizzo pubblico o un Resolvable Private Address (RPA). Il Central riceve il pacchetto, confronta l’indirizzo con i dispositivi associati archiviati e, se trova una corrispondenza, avvia il ripristino della sessione utilizzando il LTK archiviato. Se il LTK corrisponde, la connessione crittografata viene stabilita senza ripetere il pairing.
La specifica BLE definisce diversi metodi di autenticazione che influenzano il livello di sicurezza del bonding. La scelta del metodo dipende dalle capacità IO dei dispositivi — se hanno display, tastiera o la possibilità di confermare il confronto numerico. Un bonding sicuro richiede l’uso almeno di Just Works per applicazioni non critiche e Numeric Comparison o Passkey Entry per attività che richiedono protezione dagli attacchi Man-in-the-Middle.
Just Works è un metodo senza autenticazione utilizzato quando uno dei dispositivi non ha display o tastiera. Le chiavi di crittografia vengono trasmesse senza verificare l’identità del secondo dispositivo — sensori di temperatura, cardiofrequenzimetri. Just Works è vulnerabile agli attacchi MITM, quindi viene utilizzato solo per dispositivi in cui la compromissione dei dati non rappresenta una minaccia.
Numeric Comparison è un metodo di autenticazione in cui entrambi i dispositivi mostrano un numero di sei cifre e l’utente deve confermare la corrispondenza. Questo metodo fornisce protezione contro gli attacchi MITM ed è raccomandato per dispositivi con display — smartwatch, tracker fitness, telecomandi. Dopo la conferma, il bonding viene archiviato con il massimo livello di fiducia.
Passkey Entry richiede l’inserimento di un PIN a sei cifre su uno dei dispositivi. Di solito, il codice viene generato da un dispositivo e visualizzato su di esso, mentre l’utente lo inserisce sul secondo dispositivo. Questo metodo viene utilizzato per dispositivi medici e serrature IoT dove è richiesto un alto livello di sicurezza ma uno dei dispositivi non ha display per Numeric Comparison.
La gestione del bonding è il processo di visualizzazione, eliminazione e manutenzione delle chiavi archiviate dei dispositivi abbinati. Nello sviluppo mobile, è importante gestire correttamente gli stati dei dispositivi associati, specialmente quando un dispositivo periferico viene resettato o il suo firmware viene sostituito. Quando le chiavi di bonding sul Peripheral cambiano, le vecchie chiavi sul Central devono essere rimosse e deve essere effettuato un nuovo abbinamento.
iOS gestisce automaticamente i dispositivi associati attraverso lo stack di sistema Core Bluetooth. Lo sviluppatore non ha un’API diretta per visualizzare o eliminare singoli dispositivi associati — la gestione avviene attraverso le impostazioni di sistema (Impostazioni > Bluetooth > dispositivo > Forget). Se è necessario cancellare il bonding a livello di programma, l’app può indirizzare l’utente alle impostazioni Bluetooth di sistema utilizzando UIApplication.openSettingsURLString.
Android fornisce un’API diretta per lavorare con i dispositivi associati attraverso la classe BluetoothAdapter. Il metodo getBondedDevices() restituisce un Set<BluetoothDevice> di tutti i dispositivi abbinati. Per rimuovere il bonding, il metodo removeBond() viene utilizzato tramite riflessione o, su Android 12+, l’API ufficiale BluetoothDevice.removeBond().
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}
L’implementazione del bonding su Android richiede la corretta gestione del BroadcastReceiver per gli eventi BluetoothDevice.ACTION_BOND_STATE_CHANGED. Al primo collegamento a un dispositivo, il sistema Android avvia automaticamente il bonding se il dispositivo supporta questa capacità. Lo sviluppatore deve gestire tre stati: BOND_NONE (non abbinato), BOND_BONDING (abbinamento in corso), BOND_BONDED (abbinato).
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", "Associazione rimossa")
}
}
}
Per avviare il bonding su Android, il metodo createBond() deve essere chiamato sull’oggetto BluetoothDevice. Il metodo restituisce un booleano — true se il processo di abbinamento è stato avviato con successo. A partire da Android 12, createBond() richiede l’autorizzazione BLUETOOTH_CONNECT e può essere rifiutato dal sistema se l’app non ha accesso Bluetooth in background.
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "Bonding avviato", Toast.LENGTH_SHORT)
}
}
}
Gli sviluppatori di app mobili incontrano spesso errori comuni quando lavorano con il bonding di dispositivi BLE. Una gestione errata degli stati di bonding può portare a fallimenti di connessione, impossibilità di riabbinare o perdita di dati. Esaminiamo i problemi più frequenti e le loro soluzioni.
Dopo un aggiornamento del firmware di un dispositivo BLE, le sue chiavi di bonding possono essere resettate, ma lo smartphone continua a memorizzare le vecchie chiavi (stale bonding). Quando si tenta di connettere, il Central cerca di ripristinare la sessione con il vecchio LTK, il Peripheral rifiuta la chiave e la connessione fallisce. La soluzione è rimuovere il bonding sullo smartphone tramite Impostazioni > Bluetooth > Forget Device ed effettuare un nuovo abbinamento.
I chip BLE hanno un limite sul numero di record di bonding archiviabili. Per i popolari chip Nordic nRF5x, il limite è di 8-20 record a seconda della configurazione. Quando il limite viene superato, il dispositivo smette di accettare nuovi abbinamenti. La soluzione è rimuovere i record di bonding inutilizzati o utilizzare un portachiavi con pulizia prioritaria.
Quando si utilizza la funzione Privacy (indirizzi MAC casuali), il dispositivo cambia periodicamente il suo indirizzo. Se il Central non ha archiviato l’IRK, non può associare il nuovo indirizzo casuale a un dispositivo noto. La soluzione è implementare correttamente l’archiviazione IRK e utilizzarlo per risolvere RPA ad ogni rilevamento del dispositivo.
Domande frequenti
Bonding in Bluetooth Low Energy è il processo di archiviazione delle chiavi di crittografia (LTK, IRK, CSRK) dopo la fine di una sessione di pairing, per ripristinare automaticamente una connessione sicura alle successive riconnessioni senza dover reinserire il PIN o conferma.
Pairing è la negoziazione temporanea di chiavi per la sessione corrente, che vengono eliminate alla rottura della connessione. Bonding include il processo completo di pairing più l’archiviazione delle chiavi per connessioni future. Il bonding è necessario per i dispositivi che si riconnettono automaticamente — cuffie, orologi, tracker fitness.
Su un iPhone, la rimozione del bonding viene effettuata tramite le impostazioni di sistema: Impostazioni > Bluetooth > toccare l’icona delle informazioni (i) accanto al dispositivo > scegliere Forget This Device. Dopo di che, le chiavi di crittografia vengono eliminate e la prossima connessione richiederà un nuovo abbinamento.
Il numero di dispositivi associati dipende dalla capacità della memoria non volatile del chip BLE. Gli smartphone possono memorizzare centinaia di record, mentre i periferici BLE economici sono limitati a 8-20 record. Quando il limite viene superato, i vecchi record vengono sovrascritti o il dispositivo smette di accettare nuovi abbinamenti.
Stale bonding è una situazione in cui le chiavi di crittografia su un dispositivo (di solito il Peripheral) sono state resettate (ad esempio, dopo un aggiornamento del firmware), mentre il Central conserva ancora le vecchie chiavi. Di conseguenza, la connessione non può essere stabilita fino a quando l’utente non rimuove lo stale bonding tramite le impostazioni Bluetooth ed effettua un nuovo abbinamento.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche