Ibhulogi

Ukubhangqa okuphephile ku-Baby Monitor Timmy

Indlela i-ECDH, inombolo ye-SAS nokushintshisana ngolwazi lokusungula uxhumano olubethelwe okusebenza ngayo ndawonye.

Ngaphambi kokuba i-Baby Monitor Timmy idlulise umsindo nevidiyo, amadivayisi amabili kufanele atholane futhi athembane. Lesi sinyathelo sokubhangqa siyisikhathi esibaluleke kakhulu kulo lonke uhlelo. Lapha ngichaza indlela i-Timmy ebhangqa ngayo amadivayisi, ubuchwepheshe bokubhala ngemfihlo obusekela lokhu, nokuthi kungani umhlaseli oseduze engakwazi ukuthatha uxhumano ngaphandle kokubonwa.

Inkinga: Idivayisi yami yazi kanjani ukuthi ikhuluma nobani?

Lapho amadivayisi amabili exhuma okokuqala, umbuzo oyinhloko uthi: ingabe iDivayisi A ikhuluma ngempela neDivayisi B, noma kukhona umuntu ophakathi nendawo? Ku-cryptography, lokhu kubizwa ngokuthi ukuhlasela komuntu ophakathi nendawo (MITM).

I-Timmy ixazulula lokhu ngokusebenzisa ukushintshisana ngokhiye kwe-Elliptic Curve Diffie-Hellman (ECDH) nge-Firebase, kuhlanganiswe nokuqinisekiswa ngumsebenzisi ngokubheka.

Umdwebo olandelayo ubonisa lonke uhlelo lokubhangqa kafushane:

sequenceDiagram
    autonumber
    participant A as 📱 Device A
    participant F as ☁️ Firebase
    participant B as 📱 Device B

    Note over A,B: Phase 1 — Discovery

    A->>A: Generate ECDH key pair (P-256)
    B->>B: Generate ECDH key pair (P-256)

    alt Auto-Pairing (Nearby BLE)
        A-->>B: BLE broadcast: SBM:XKQM
        B-->>A: BLE broadcast: SBM:R7NP
        Note over A,B: Lower code wins → determines creator/joiner
    else Manual Pairing
        A->>A: Display 4-char code
        Note right of A: User reads code
        B->>B: User enters code
    end

    Note over A,B: Phase 2 — ECDH Key Exchange

    A->>F: Write public key (PubA) to meeting doc
    B->>F: Write public key (PubB) to meeting doc
    F-->>B: Read PubA
    F-->>A: Read PubB

    Note over A,B: Phase 3 — Shared Secret

    A->>A: sharedSecret = ECDH(privA, PubB)
    B->>B: sharedSecret = ECDH(privB, PubA)
    Note over A,B: Both compute identical 32-byte secret

    A->>A: SAS = SHA-256("sas:" + sort(PubA,PubB) + secret) → 2-digit number
    B->>B: SAS = SHA-256("sas:" + sort(PubA,PubB) + secret) → 2-digit number

    Note over A,B: Phase 4 — Visual Verification

    A->>A: Display SAS: 42
    B->>B: Display SAS: 42
    Note over A,B: 👤 User compares numbers on both screens

    A->>A: User confirms ✓
    B->>B: User confirms ✓

    Note over A,B: Phase 5 — Key Derivation

    A->>A: pairingKey = SHA-256("pair:" + secret)
    B->>B: pairingKey = SHA-256("pair:" + secret)
    A->>A: docKey = SHA-256("doc:" + pairingKey)
    A->>A: encKey = SHA-256("enc:" + pairingKey)

    Note over A,B: ✅ Paired — all future signaling encrypted with AES-256-GCM
      

Ukulandelana okuphelele kwephrothokholi yokubhangqa — umthombo ohlelekayo: docs/diagrams/pairing-sequence.mmd

Isinyathelo 1: Idivayisi ngayinye yakha ipheya yokhiye

Lapho kuvulwa isikrini sokubhangqa, idivayisi ngayinye yakha ipheya yokhiye ye-ECDH yesikhashana egobeni le-P-256 (secp256r1):

Okhiye bakhiwa kusetshenziswa umkhiqizi wezinombolo ezingahleliwe ovikelekile ngokwe-cryptography (Random.secure()) futhi basebenza kulowo mzamo owodwa wokubhangqa kuphela. Okhiye abasha bayakhiwa ngomzamo ngamunye omusha.

Isinyathelo 2: Ukushintshisana ngokhiye basesidlangalaleni nge-Firebase

Ukuze amadivayisi amabili atholane, i-Timmy isebenzisa ikhodi yezinhlamvu ezi-4 njengendawo yokuhlangana. Le khodi ingatholwa ngokuzenzakalela nge Nearby Connections (Bluetooth Low Energy) noma ifakwe ngesandla. Ayinakho ukubaluleka kwe-cryptography; yenza nje amadivayisi womabili athole idokhumenti efanayo ye-Firebase Firestore.

Uma womabili amadivayisi eseyazi ikhodi, ngalinye libhala ukhiye walo we-ECDH wasesidlangalaleni kudokhumenti eyabiwe ye Firestore. Bese idivayisi ngayinye ifunda ukhiye wasesidlangalaleni wenye idivayisi kuleyo dokhumenti.

Okubalulekile: kuthunyelwa ukhiye wasesidlangalaleni kuphela. Ukhiye oyimfihlo awulokothi uphume kudivayisi. Noma ubani obuka ukuxhumana kwe-Firebase ubona okhiye basesidlangalaleni, kodwa akakwazi ukubala imfihlo eyabiwe ngabo. Lokhu kusekelwe ebunzimeni be Elliptic Curve Discrete Logarithm Problem (ECDLP).

Isinyathelo 3: Ukubala imfihlo eyabiwe

Lapho womabili amadivayisi esethole ukhiye wasesidlangalaleni womunye nomunye, azibala ngokuzimela le mfihlo eyabiwe:

sharedSecret = ECDH(myPrivateKey, remotePublicKey)
             → 32 bytes (identical on both devices)

Izibalo zamagobe e-elliptic ziqinisekisa ukuthi zombili izibalo zinikeza umphumela ofanayo, nakuba idivayisi ngayinye yazi ukhiye wayo oyimfihlo kuphela nokhiye wasesidlangalaleni wowenye.

Isinyathelo 4: Inombolo yokuqinisekisa (SAS)

Emfihlweni eyabiwe, kwakhiwa i-Short Authentication String (SAS) — inombolo enamadijithi amabili eboniswa kuwo womabili amadivayisi:

hash   = SHA-256("sas:" + sort(pubkeyA, pubkeyB) + sharedSecret)
number = (hash[0] × 256 + hash[1]) mod 100   → 00 to 99

Womabili amadivayisi abonisa inombolo efanayo — isibonelo, 42. Umsebenzisi ubheka ukuthi izinombolo ezikuzikrini zombili ziyafana yini, bese eqinisekisa ku divayisi ngayinye ngokwehlukana.

Kungani umhlaseli engakwazi ukukopela lokhu

Umhlaseli ophakathi nendawo kuzodingeka angenelele ekushintshisaneni ngokhiye ku-Firebase. Ngokuqondile, kuzodingeka:

  1. Ashintshe okhiye bangempela basesidlangalaleni abagcinwe kudokhumenti ye-Firestore afake abakhe
  2. Akhe izimfihlo ezabiwe ezihlukene nedivayisi ngayinye
sequenceDiagram
    autonumber
    participant A as 📱 Device A
    participant M as 🕵️ Attacker (MITM)
    participant B as 📱 Device B

    Note over A,B: Attacker intercepts the Firebase key exchange

    A->>A: Generate key pair (privA, PubA)
    B->>B: Generate key pair (privB, PubB)
    M->>M: Generate TWO key pairs (privM1, PubM1) + (privM2, PubM2)

    A->>M: Write PubA to Firebase
    M->>M: Replace PubA with PubM1
    M->>B: B reads PubM1 (thinks it is PubA)

    B->>M: Write PubB to Firebase
    M->>M: Replace PubB with PubM2
    M->>A: A reads PubM2 (thinks it is PubB)

    Note over A,B: Each device computes a DIFFERENT shared secret

    A->>A: secret_A = ECDH(privA, PubM2)
    M->>M: secret_A = ECDH(privM2, PubA)
    M->>M: secret_B = ECDH(privM1, PubB)
    B->>B: secret_B = ECDH(privB, PubM1)

    Note over A,M: secret_A ≠ secret_B

    A->>A: SAS_A = SHA-256("sas:" + sort(PubA,PubM2) + secret_A) → 73
    B->>B: SAS_B = SHA-256("sas:" + sort(PubM1,PubB) + secret_B) → 18

    rect rgb(255, 230, 230)
        Note over A,B: ❌ User sees DIFFERENT numbers!
        A->>A: Display: 73
        B->>B: Display: 18
        Note over A,B: 👤 User notices mismatch → cancels pairing
    end

    Note over A,B: 🛡️ Attack detected — MITM cannot force SAS match (P = 1/100)
      

Ukutholwa komuntu ophakathi nendawo ngokungafani kwe-SAS — umthombo ohlelekayo: docs/diagrams/mitm-detection.mmd

Kulokhu, umhlaseli ubala imfihlo eyabiwe S_A neDivayisi A kanye nemfihlo eyabiwe ehlukile S_B neDivayisi B. Njengoba S_A ≠ S_B, amadivayisi abala izinombolo zokuqinisekisa ezihlukene.

Umhlaseli angeke enze izinombolo zifane ngoba:

Umsebenzisi ubona izinombolo ezingafani ezikrinini bese ekhansela ukubhangqa. Ngaleso sikhathi, ukuhlasela sekubonakele.

Isinyathelo 5: Ukuqedela ukubhangqa

Ukubhangqa kuqedwa kuphela ngemva kokuba umsebenzisi eseqinisekise inombolo yokuqinisekisa kuwo womabili amadivayisi :

  1. Ukhiye wokubhangqa onezinhlamvu ezingama-64 (amabhithi angu-256) utholakala emfihlweni eyabiwe: SHA-256("pair:" + sharedSecret) → pairingKey
  2. Ukhiye wedokhumenti utholakala njengokuthi SHA-256("doc:" + pairingKey) futhi usebenza njengokhiye wedokhumenti ye-Firestore
  3. Ukhiye wokubethela utholakala njengokuthi SHA-256("enc:" + pairingKey) futhi unikeza ukhiye we-AES-256-GCM wokubethela ulwazi lokusungula uxhumano
  4. Womabili amadivayisi agcina ukhiye ofanayo wokubhangqa bese eya ekukhetheni imodi

Kusukela lapha kuya phambili, yonke imizamo yokuxhuma elandelayo (ukushintshisana ngolwazi lokusungula uxhumano nge-Firestore nokusetha i-WebRTC) ibethelwa ngokhiye owabiwe we-AES-256-GCM. Ukhiye wokubhangqa awulokothi uthunyelwe ohlelweni lwangemuva; kusetshenziswa i-hash yawo ye-SHA-256 kuphela njengesihlonzi sedokhumenti.

Ukwakheka kwesistimu

Umdwebo olandelayo ubonisa izingxenye ezibandakanyekayo ekubhangqeni nasekuxhumaneni:

flowchart TB
    BABY["📱 Baby Phone
Baby Mode"] PARENT["📱 Parent Phone
Parent Mode"] BABY <==>|"🔒 WebRTC Peer-to-Peer · DTLS-SRTP
Audio · Video · DataChannel"| PARENT BABY -.-|"🔵 Bluetooth LE · Nearby
Auto-Discovery"| PARENT subgraph FIREBASE["☁️ Firebase (Google Cloud)"] direction LR AUTH["🪪 Anonymous
Authentication"] FS["📄 Firestore
Pairing + Signaling"] CF["⚡ Cloud Functions
getTurnCredentials"] end BABY <-->|"🔐 AES-256-GCM encrypted
SDP · ICE · ECDH keys"| FS FS <-->|"🔐 AES-256-GCM encrypted
SDP · ICE · ECDH keys"| PARENT BABY -.->|Token| AUTH PARENT -.->|Token| AUTH STUN["📡 STUN server
stun.cloudflare.com:3478"] TURN["🔄 TURN relay
local or Cloudflare"] BABY & PARENT -->|Short-lived credentials| CF CF -->|local first, Cloudflare fallback| TURN BABY & PARENT -.->|NAT Traversal| STUN BABY -.->|"Relay Fallback"| TURN TURN -.->|"Relay Fallback"| PARENT style BABY fill:#FBF6F0,stroke:#B5734A,stroke-width:2px style PARENT fill:#FBF6F0,stroke:#B5734A,stroke-width:2px style FIREBASE fill:#fff5f5,stroke:#E9B44C,stroke-width:2px style AUTH fill:#E9B44C,stroke:#2B2D42 style FS fill:#E9B44C,stroke:#2B2D42 style CF fill:#E9B44C,stroke:#2B2D42 style STUN fill:#F6E3D2,stroke:#B5734A style TURN fill:#7BC47F,stroke:#2B2D42

Ukubuka konke kwesakhiwo sesistimu — umthombo ohlelekayo: docs/diagrams/pairing-architecture.mmd

Izindlela zokuxhumana ngokuningiliziwe:

Okunye: Ukufaka ikhodi ngesandla

Uma i-Bluetooth ingatholakali (isib., kumadivayisi amadala), ikhodi yezinhlamvu ezi-4 ingafakwa nangesandla. Ukufaka ngesandla kusebenzisa ukushintshisana ngokhiye kwe-ECDH okufanayo nokuqinisekiswa kwe-SAS okufanayo njengokubhangqa okuzenzakalelayo. Umehluko kuphela ukuthi ikhodi ifundwa bese ifakwa ngumsebenzisi, kunokuba itholwe nge-BLE.

Ngenxa yokuthi ukushintshisana ngokhiye kwe-ECDH kwenzeka nge-Firebase kuzo zombili izimo, ukuphepha kuyafana. Ikhodi yezinhlamvu ezi-4 iyindawo yokuhlangana kuphela; ukubethela kwangempela kusekelwe kukhiye wamabhithi angu-256 otholakala ku-ECDH.

Isifinyezo

Indlela yokuphepha Ivikela kulokhu
Ukushintshisana ngokhiye kwe-ECDH (P-256) Ukulalela ukuxhumana kokushintshisana ngokhiye
Amapheya okhiye esikhashana Ukuvikeleka kokhiye besikhathi esidlule (forward secrecy) — ukubhangqa kwangaphambilini kuhlala kuphephile
Inombolo yokuqinisekisa ngokubheka (SAS) Umuntu ophakathi nendawo (MITM) ngesikhathi sokushintshisana ngokhiye
I-hash ye-SHA-256 njengokhiye wedokhumenti Ukukhishwa kwekhodi ku-Firestore
Ukubethela kwe-AES-256-GCM Ukulalela ulwazi lokusungula uxhumano
Ukuqinisekisa ezinhlangothini zombili Ukubhangqa ohlangothini olulodwa umsebenzisi engazi
DTLS-SRTP (WebRTC) Ukulalela umsindo/ividiyo

Lezi zingqimba zisebenza ndawonye: i-ECDH ivikela ukushintshisana ngokhiye, inombolo yokuqinisekisa ivikela ekuhlaselweni kwe-MITM, i-AES-256-GCM ivikela ulwazi lokusungula uxhumano, kanti i-WebRTC ivikela imidiya. Kuzodingeka umhlaseli aphule lolu chungechunge ezindaweni eziningana ngaphandle kokuba amadivayisi noma abazali babone.


Ezinye izihloko