11.13. Uparivanje i povezivanje

Sve što je do sada obrađeno prenosi bajtove preko radija u otvorenom obliku. Bilo tko s prijenosnim računalom koje podržava BLE u istoj prostoriji može slušati na kanalima za oglašavanje, pratiti sekvencu preskakanja otvorene veze i očitati svako čitanje, pisanje i obavijest koja prolazi kroz nju. Za većinu javnih senzorskih podataka (razina baterije, temperatura okoline) to je u redu. Za sve što dvije krajnje točke žele zadržati privatnim – upravljački registar koji aktivira relej, lozinku, mjerenje koje se ne bi trebalo široko emitirati – veza mora biti šifrirana, a u idealnom slučaju kamera mora znati s kim razgovara.

BLE pruža oboje kroz uparivanje i povezivanje.

11.13.1. Uparivanje, povezivanje, šifriranje

Tri usko povezana koncepta:

  • Šifriranje je krajnji cilj. Kada je veza šifrirana, svaki paket na podatkovnim kanalima mogu dešifrirati samo dvije krajnje točke; prisluškivač vidi samo šum.

  • Uparivanje je postupak koji dvije krajnje točke provode kako bi se dogovorile o ključevima koje šifriranje koristi. Riječ je o jednokratnoj razmjeni koja proizvodi zajednički ključni materijal koji sloj veze priključuje na svoj mehanizam za šifriranje.

  • Povezivanje je odluka da se ključevi trajno pohrane u nepostojanu pohranu nakon završetka uparivanja, tako da sljedeća veza između istih dvaju uređaja preskače uparivanje i odmah prelazi na šifriranje.

Jednostavno rečeno: uparivanje je „predstavite se”; povezivanje je „zapamtite ovo predstavljanje”; šifriranje je „od sada razgovarajte u privatnosti”.

Dva stupca označena "Central" i "Peripheral". Isprekidana linija pri vrhu označena "BLE connection open (unencrypted)". Ispod nje tri strelice: "pairing request" od centralnog prema perifernom, "key exchange" u oba smjera, "pairing complete" prema naprijed. Druga isprekidana linija ispod označena "link encrypted". Dvije debele dvosmjerne strelice nose "encrypted GATT traffic". Neobavezni okvir "store keys to flash" sa strane, označen "bonding".

Tijek uparivanja povrh otvorene BLE veze. Kada se razmjena ključeva dovrši, sloj veze šifrira svaki sljedeći paket. Povezivanje je dodatni korak zapisivanja ključeva u flash memoriju.

11.13.2. LE Secure Connections

Moderna razmjena ključeva koju BLE koristi jest LE Secure Connections, izgrađena na Elliptic Curve Diffie-Hellman algoritmu. Obje strane generiraju privremeni par ključeva, razmjenjuju javne polovice i kombiniraju rezultat s vlastitim privatnim ključevima kako bi došle do iste zajedničke tajne – tajne koju prisluškivač ne može izračunati čak ni s potpunim zapisom razmjene.

Stariji LE Legacy postupak manje je siguran (prisluškivač s potpunom razmjenom obično može povratiti ključ) i postoji samo radi povratne kompatibilnosti sa starim periferijama. Zadana postavka modula aioble jest moderni postupak (le_secure=True); zadržite je.

11.13.3. Pokretanje uparivanja

Centralni se uređaj upari pozivom metode aioble.DeviceConnection.pair() na već otvorenoj vezi:

async with await device.connect() as connection:
    await connection.pair(bond=True, le_secure=True, mitm=False)
    # ... GATT work, now over an encrypted link ...

Nakon što pair vrati rezultat, atributi encrypted, authenticated, bonded i key_size na vezi odražavaju ono što je dogovoreno.

Četiri najkorisnija imenovana argumenta:

  • bond=True – sprema dobivene ključeve u flash memoriju tako da sljedeća veza između istih dvaju uređaja preskoči rukovanje uparivanja. Zadano True.

  • le_secure=True – koristi LE Secure Connections. Zadano True. Ostavite ga uključenim.

  • mitm=False – treba li zahtijevati zaštitu od man-in-the-middle napada. Za to je potreban izvanpojasni kanal (brojčani kod prikazan na jednoj strani i potvrđen na drugoj, upisana pristupna šifra, …) kako bi korisnik mogao provjeriti jesu li dva uređaja u rukovanju uparivanja doista ona koja misli da jesu. Zadano je False (bez MITM zaštite – pasivni prisluškivač ne može čitati vezu, ali napadač koji aktivno preusmjerava veze mogao bi se ubaciti u uparivanje). Postavite na True za sve osjetljivo, ali imajte na umu da to zahtijeva da periferija doista podržava neku IO sposobnost.

  • io=3 – IO sposobnost koju uređaj prijavljuje. Bluetooth specifikacija definira pet: 0 samo prikaz, 1 prikaz + da/ne, 2 samo tipkovnica, 3 bez ulaza i izlaza, 4 tipkovnica + prikaz. Kamera bez korisničkog sučelja obično prijavljuje 3; ako sama kamera ima zaslon, aplikacija bi mogla prikazati brojčanu potvrdu i koristiti 1. Kombinacija IO sposobnosti obiju strana odlučuje je li ostvariva stvarna MITM zaštita.

Periferije same ne pozivaju pair – one odgovaraju na ono što centralni uređaj pokrene. Je li šifriranje obavezno za određenu karakteristiku svojstvo je načina na koji je ona deklarirana u GATT bazi podataka; bitovi pristupa koji zahtijevaju šifriranje dio su niskorazinskog bluetooth API-ja i trenutačno nisu izloženi kroz konstruktor karakteristike modula aioble.

11.13.4. Povezivanje – i gdje ključevi žive

Kada je bond=True, aioble zapisuje ključeve u JSON datoteku na lokalnom datotečnom sustavu. Zadani naziv datoteke jest ble_secrets.json, zapisan relativno u odnosu na trenutačni radni direktorij. Na svježe pokrenutoj kameri _boot.py već je odabrao taj direktorij: /sdcard kada je kartica montirana, /flash inače – pa datoteka završava na /sdcard/ble_secrets.json ili /flash/ble_secrets.json. Datoteka sadrži unose potrebne za ponovno šifriranje veze sljedeći put kada se povezani partner ponovno spoji, uključujući identitetsku adresu partnera.

Jednu asimetriju treba imati na umu: spremanje se događa automatski kako se ključevi mijenjaju, ali učitavanje datoteke pri sljedećem pokretanju ne. Pozovite aioble.security.load_secrets() jednom pri pokretanju (prije bilo kakvog uparivanja ili oglašavanja) kako bi se prethodno povezani partneri prepoznali:

import aioble
aioble.security.load_secrets()        # default path: ble_secrets.json

Nakon toga, sljedeći put kada se povezani partner pojavi, aioble ponovno koristi pohranjene ključeve i veza postaje šifrirana bez daljnjeg rukovanja.

Dvije praktične posljedice pohranjivanja ključeva u flash memoriju:

  • Zaboravljanje uređaja. Izbrišite ble_secrets.json (ili uklonite relevantni unos) kako biste zaboravili sve povezane partnere, a zatim se ponovno uparite ispočetka.

  • Fizički pristup otkriva ključeve. Bilo tko s pristupom datotečnom sustavu kamere može pročitati JSON. To je ista vrsta ograničenja koja se pojavila na mrežnoj strani s TLS ključevima (Operacije: ključevi, istek i rješavanje problema): koristite ključeve po uređaju, tretirajte svaki pohranjeni ključ kao mogući za oporavak i oslonite se na mogućnost opoziva (ovdje, uklanjanje povezivanja na centralnoj strani) umjesto na to da ključ ostane tajan.

11.13.5. Što šifriranje jamči – a što ne

Veza s pristupom upari-pa-šifriraj daje, prema redoslijedu snage:

  • Povjerljivost. Uvijek. Prisluškivač ne može pročitati bajtove.

  • Cjelovitost. Uvijek. Izmijenjeni paketi ne prolaze provjeru autentificiranog šifriranja na sloju veze i odbacuju se.

  • Autentikacija. Samo uz mitm=True i sposobnu IO. Bez toga, čovjek u sredini koji je presreo izvornu razmjenu uparivanja mogao se ubaciti; bez MITM zaštite ne postoji način da dvije strane to saznaju.

Za većinu slučajeva uporabe kamere – telefon se jednom upari s kamerom, a zatim se kasnije ponovno spoji – mitm=False obično je dovoljno, jer se izvorno uparivanje događa u kontroliranom okruženju (korisnik drži oba uređaja u istoj prostoriji). Za aplikacije gdje bi se upareni uređaj mogao prvi put susresti s kamerom na velikoj udaljenosti ili kroz nepouzdanog posrednika, MITM je ispravna postavka.

11.13.6. Kada je uparivanje pogrešan odgovor

Uparivanje ima stvarnu cijenu: nekoliko sekundi razmjene pri prvom spajanju, trajnu uporabu flash memorije za svaki povezani uređaj i priču o oporavku „zaboravi povezivanje” ako nešto pođe po zlu. Za istinski javne podatke – očitanja senzora okoline objavljena kao beacon, znak koji prikazuje svoje ime, sve što se ne mijenja činom čitanja ili pisanja – ispravan odgovor jest uopće ne šifrirati i pustiti bilo koji obližnji skener da očita vrijednosti.

Za sve ostalo, connection.pair(bond=True) na centralnom uređaju jednoredni je dodatak koji vezu pretvara iz javnog kanala u privatni.