11.13. Pariutuminen ja sidonta

Kaikki tähän asti käsitelty siirtää tavuja radioyhteyden yli selväkielisinä. Kuka tahansa, jolla on BLE-yhteensopiva kannettava samassa huoneessa, voi kuunnella mainostuskanavia, seurata avoimen yhteyden hyppysekvenssiä ja lukea jokaisen lukemisen, kirjoituksen ja ilmoituksen, joka liikenteessä kulkee. Useimmille julkisille sensoridatoille (akun varaustaso, ympäristön lämpötila) tämä on hyväksyttävää. Mille tahansa, jonka molemmat päätepisteet haluavat pitää yksityisenä – ohjausrekisteri, joka virittää releen, salasana, mittaus jota ei pitäisi laajalti lähettää – yhteys täytyy salata, ja mieluiten kameran täytyy tietää kenen kanssa se keskustelee.

BLE tarjoaa molemmat pariutumisen ja sidonnan kautta.

11.13.1. Pariutuminen, sidonta, salaus

Kolme läheisesti toisiinsa liittyvää käsitettä:

  • Salaus on perimmäinen tavoite. Kun yhteys on salattu, jokainen datakanavien paketti on tulkittavissa vain kahden päätepisteen toimesta; salakuuntelija näkee pelkkää kohinaa.

  • Pariutuminen on menettely, jonka kaksi päätepistettä suorittavat sopiakseen avaimista, joita salaus käyttää. Se on kertaluonteinen vaihto, joka tuottaa jaettua avainmateriaalia, jonka linkkikerros liittää salausmoottoriinsa.

  • Sidonta on valinta säilyttää avaimet haihtumattomaan muistiin pariutumisen päätyttyä, jotta seuraava yhteys samojen kahden laitteen välillä ohittaa pariutumisen ja siirtyy suoraan salaukseen.

Yksinkertaisesti sanottuna: pariutuminen on ”esittäytykää”; sidonta on ”muista tämä esittely”; salaus on ”puhukaa tästä lähtien yksityisesti”.

Kaksi saraketta, joiden otsikot ovat "Central" ja "Peripheral". Lähellä yläosaa katkoviiva, jonka otsikko on "BLE connection open (unencrypted)". Sen alla kolme nuolta: "pairing request" keskustasta oheislaitteeseen, "key exchange" molempiin suuntiin, "pairing complete" eteenpäin. Toinen katkoviiva alempana otsikolla "link encrypted". Kaksi paksua kaksisuuntaista nuolta kuljettavat "encrypted GATT traffic". Sivulla valinnainen "store keys to flash" -laatikko otsikolla "bonding".

Pariutumisen kulku avoimen BLE-yhteyden päällä. Kun avaintenvaihto on valmis, linkkikerros salaa jokaisen myöhemmän paketin. Sidonta on lisävaihe, jossa avaimet kirjoitetaan flash-muistiin.

11.13.2. LE Secure Connections

BLE:n käyttämä nykyaikainen avaintenvaihto on LE Secure Connections, joka rakentuu Elliptic Curve Diffie-Hellman -menetelmälle. Molemmat osapuolet luovat väliaikaisen avainparin, vaihtavat julkiset puoliskot ja yhdistävät tuloksen omiin yksityisiin avaimiinsa päätyäkseen samaan jaettuun salaisuuteen – salaisuuteen, jota salakuuntelija ei voi laskea edes täydellisellä tallenteella vaihdosta.

Vanhempi LE Legacy -menetelmä on vähemmän turvallinen (salakuuntelija, jolla on koko vaihto, voi yleensä palauttaa avaimen) ja on olemassa vain taaksepäin yhteensopivuuden vuoksi vanhojen oheislaitteiden kanssa. aioble-oletus on nykyaikainen menetelmä (le_secure=True); pidä se.

11.13.3. Pariutumisen aloittaminen

Keskuslaite pariutuu kutsumalla aioble.DeviceConnection.pair() jo avoimella yhteydellä:

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

Kun pair palaa, yhteyden attribuutit encrypted, authenticated, bonded ja key_size heijastavat sitä, mistä neuvoteltiin.

Neljä hyödyllisintä avainsana-argumenttia:

  • bond=True – tallenna tuloksena syntyvät avaimet flash-muistiin, jotta seuraava yhteys samojen kahden laitteen välillä ohittaa pariutumisen kättelyn. Oletus True.

  • le_secure=True – käytä LE Secure Connections -menetelmää. Oletus True. Jätä se päälle.

  • mitm=False – vaaditaanko man-in-the-middle-suojaus. Tämä tarvitsee out-of-band-kanavan (numerokoodi, joka näytetään toisella puolella ja vahvistetaan toisella, sisään kirjoitettu pääsykoodi, …), jotta käyttäjä voi varmistaa, että pariutumisen kättelyssä olevat kaksi laitetta ovat todella ne, joita hän luulee. Oletuksena False (ei MITM-suojausta – passiivinen salakuuntelija ei voi lukea yhteyttä, mutta hyökkääjä, joka aktiivisesti ohjaa yhteyksiä uudelleen, voisi pariuttaa itsensä mukaan). Aseta arvoon True mille tahansa arkaluonteiselle, mutta huomaa, että se edellyttää oheislaitteen todella tukevan IO-ominaisuutta.

  • io=3 – IO-ominaisuus, jonka laite ilmoittaa. Bluetooth-määrittely määrittelee viisi: 0 vain näyttö, 1 näyttö + kyllä/ei, 2 vain näppäimistö, 3 ei syöttöä ei tulostusta, 4 näppäimistö + näyttö. Kamera ilman käyttöliittymää ilmoittaa tyypillisesti 3; jos kamerassa itsessään on näyttö, sovellus voisi näyttää numeerisen vahvistuksen ja käyttää arvoa 1. Kahden osapuolen IO-ominaisuuksien yhdistelmä päättää, onko todellinen MITM-suojaus saavutettavissa.

Oheislaitteet eivät kutsu pair itse – ne vastaavat siihen, mitä keskuslaite aloittaa. Vaaditaanko tietylle ominaisuudelle salaus, on ominaisuus siitä, miten se on määritelty GATT-tietokannassa; salausta vaativat pääsybitit ovat osa matalan tason bluetooth-rajapintaa, eikä niitä tällä hetkellä paljasteta aioble-ominaisuuskonstruktorin kautta.

11.13.4. Sidonta – ja missä avaimet sijaitsevat

Kun bond=True, aioble kirjoittaa avaimet JSON-tiedostoon paikalliseen tiedostojärjestelmään. Oletustiedostonimi on ble_secrets.json, kirjoitettuna suhteessa nykyiseen työhakemistoon. Juuri käynnistetyssä kamerassa _boot.py on jo valinnut kyseisen hakemiston: /sdcard kun kortti on liitettynä, /flash muuten – joten tiedosto päätyy paikkaan /sdcard/ble_secrets.json tai /flash/ble_secrets.json. Tiedosto sisältää merkinnät, joita tarvitaan yhteyden uudelleensalaamiseen seuraavan kerran kun sidottu vertaislaite yhdistyy uudelleen, mukaan lukien vertaislaitteen identiteettiosoite.

Yksi epäsymmetria muistettavaksi: tallentaminen tapahtuu automaattisesti avainten muuttuessa, mutta tiedoston lataaminen seuraavalla käynnistyksellä ei. Kutsu aioble.security.load_secrets() kerran käynnistyksen yhteydessä (ennen mitään pariutumista tai mainostusta), jotta aiemmin sidotut vertaislaitteet tunnistetaan:

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

Sen jälkeen, seuraavan kerran kun sidottu vertaislaite ilmestyy, aioble käyttää uudelleen tallennettuja avaimia ja yhteys salataan ilman lisäkättelyä.

Kaksi käytännön seurausta avainten tallentamisesta flash-muistiin:

  • Laitteen unohtaminen. Poista ble_secrets.json (tai poista asiaankuuluva merkintä) unohtaaksesi kaikki sidotut vertaislaitteet, ja pariudu sitten uudelleen alusta.

  • Fyysinen pääsy vuotaa avaimet. Kuka tahansa, jolla on pääsy kameran tiedostojärjestelmään, voi lukea JSONin. Tämä on samankaltainen rajoite, joka tuli esiin verkkopuolella TLS-avainten kanssa (Käyttö: avaimet, vanheneminen ja vianmääritys): käytä laitekohtaisia avaimia, käsittele kaikkia tallennettuja avaimia palautettavissa olevina, ja luota peruutuskykyyn (tässä sidonnan poistamiseen keskuslaitteen puolella) sen sijaan, että avain pysyisi salassa.

11.13.5. Mitä salaus takaa – ja mitä se ei takaa

Pariudu-sitten-salaa-yhteys antaa, vahvuusjärjestyksessä:

  • Luottamuksellisuus. Aina. Salakuuntelija ei voi lukea tavuja.

  • Eheys. Aina. Muokatut paketit epäonnistuvat linkkikerroksen todennetun salauksen tarkistuksessa ja hylätään.

  • Todennus. Vain mitm=True-asetuksella ja kykenevällä IO:lla. Ilman sitä man-in-the-middle, joka sieppasi alkuperäisen pariutumisvaihdon, olisi voinut lisätä itsensä mukaan; ilman MITM-suojausta osapuolilla ei ole mitään tapaa tietää sitä.

Useimmissa kameran käyttötapauksissa – puhelin pariutuu kameran kanssa kerran, sitten yhdistyy uudelleen myöhemmin – mitm=False riittää yleensä, koska alkuperäinen pariutuminen tapahtuu hallitussa ympäristössä (käyttäjä pitää molempia laitteita samassa huoneessa). Sovelluksille, joissa pariutettu laite saattaa ensin kohdata kameran pitkän etäisyyden takaa tai epäluotettavan välittäjän kautta, MITM on oikea asetus.

11.13.6. Kun pariutuminen on väärä vastaus

Pariutumisella on todellinen kustannus: muutaman sekunnin vaihto ensimmäisellä yhteydellä, pysyvä flash-muistin käyttö jokaiselle sidotulle laitteelle, ja ”unohda sidonta” -palautusmenettely, jos jokin menee pieleen. Aidosti julkiselle datalle – ympäristösensorin lukemille, jotka julkaistaan majakkana, kyltille, joka näyttää nimensä, mille tahansa, joka ei muuta maailmaa tullessaan luetuksi tai kirjoitetuksi – oikea vastaus on olla salaamatta lainkaan, ja antaa minkä tahansa lähistöllä olevan skannerin lukea arvot.

Kaikelle muulle connection.pair(bond=True) keskuslaitteessa on yhden rivin lisäys, joka muuttaa yhteyden julkisesta kanavasta yksityiseksi.