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”.
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. ZadanoTrue.le_secure=True– koristi LE Secure Connections. ZadanoTrue. 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 jeFalse(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 naTrueza 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:0samo prikaz,1prikaz + da/ne,2samo tipkovnica,3bez ulaza i izlaza,4tipkovnica + prikaz. Kamera bez korisničkog sučelja obično prijavljuje3; ako sama kamera ima zaslon, aplikacija bi mogla prikazati brojčanu potvrdu i koristiti1. 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=Truei 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.