బ్లాగ్

Baby Monitor Timmyలో సురక్షిత జతచేయడం

ECDH, SAS నంబర్, ఎన్‌క్రిప్ట్ చేసిన సిగ్నలింగ్ కలిసి ఎలా పనిచేస్తాయో.

Baby Monitor Timmy ఆడియో, వీడియోను పంపే ముందు, రెండు పరికరాలు ఒకదానిని ఒకటి గుర్తించి పరస్పరం నమ్మాలి. ఈ జతచేయడం దశ మొత్తం ప్రక్రియలో అత్యంత కీలకమైనది. Timmy ఎలా జతచేస్తుందో, దాని వెనుక ఉన్న క్రిప్టోగ్రఫీ ఏమిటో, అలాగే దగ్గరలోని దాడి చేసే వ్యక్తి తెలియకుండా కనెక్షన్‌ను ఎందుకు స్వాధీనం చేసుకోలేడో ఇక్కడ వివరిస్తాను.

సమస్య: నా పరికరం ఎవరితో మాట్లాడుతోందో దానికి ఎలా తెలుస్తుంది?

రెండు పరికరాలు మొదటిసారి కనెక్ట్ అయినప్పుడు ప్రధాన ప్రశ్న ఇదే: పరికరం A నిజంగా పరికరం Bతోనే మాట్లాడుతోందా, లేక మధ్యలో ఎవరైనా ఉన్నారా? క్రిప్టోగ్రఫీలో దీనిని మ్యాన్-ఇన్-ది-మిడిల్ దాడి (MITM) అంటారు.

Timmy దీన్ని Elliptic Curve Diffie-Hellman (ECDH) కీ మార్పిడి ను Firebase ద్వారా ఉపయోగించి, వినియోగదారు చేసే దృశ్య ధృవీకరణతో కలిపి పరిష్కరిస్తుంది..

కింది రేఖాచిత్రం పూర్తి జతచేయు ప్రవాహాన్ని ఒక చూపులో చూపిస్తుంది:

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
      

పూర్తి జతచేయు ప్రోటోకాల్ క్రమం — సవరించగల మూలం: docs/diagrams/pairing-sequence.mmd

దశ 1: ప్రతి పరికరం ఒక కీ జతను రూపొందిస్తుంది

జతచేయు స్క్రీన్ తెరిచినప్పుడు, ప్రతి పరికరం ఒక తాత్కాలిక ECDH కీ జతను P-256 కర్వ్ (secp256r1)పై రూపొందిస్తుంది:

కీలు క్రిప్టోగ్రఫీకి సురక్షితమైన యాదృచ్ఛిక సంఖ్య జనరేటర్‌తో (Random.secure()) రూపొందించబడతాయి; అవి ఈ ఒక్క జతచేయు ప్రయత్నానికే చెల్లుబాటు అవుతాయి. ప్రతి కొత్త ప్రయత్నానికి కొత్త కీలు రూపొందుతాయి.

దశ 2: Firebase ద్వారా పబ్లిక్ కీల మార్పిడి

రెండు పరికరాలు ఒకదానిని ఒకటి కనుగొనేందుకు, Timmy ఒక 4-అక్షరాల కోడ్‌ను కలిసే చోటుగా ఉపయోగిస్తుంది. ఈ కోడ్‌ను Nearby Connections (Bluetooth Low Energy) ద్వారా స్వయంచాలకంగా కనుగొనవచ్చు లేదా చేతితో నమోదు చేయవచ్చు. దీనికి ఎటువంటి క్రిప్టోగ్రాఫిక్ విలువ లేదు; ఇది రెండు పరికరాలు ఒకే Firebase Firestore డాక్యుమెంట్‌ను కనుగొనేలా మాత్రమే చేస్తుంది.

రెండు పరికరాలకూ కోడ్ తెలిసిన తర్వాత, ప్రతి ఒక్కటి తన పబ్లిక్ ECDH కీని ఒక ఉమ్మడి Firestore డాక్యుమెంట్‌లోరాస్తుంది. తర్వాత ప్రతి పరికరం ఆ డాక్యుమెంట్ నుంచి మరొక పరికరం పబ్లిక్ కీని చదువుతుంది.

ముఖ్యంగా గుర్తుంచుకోవాల్సింది: కేవలం పబ్లిక్ కీ మాత్రమే పంపబడుతుంది. ప్రైవేట్ కీ ఎప్పుడూ పరికరం వెలుపలికి వెళ్లదు. Firebase ట్రాఫిక్‌ను గమనించే ఎవరైనా పబ్లిక్ కీలను చూస్తారు, కానీ వాటి నుంచి ఉమ్మడి రహస్యాన్ని లెక్కించలేరు . ఇది Elliptic Curve Discrete Logarithm Problem (ECDLP) యొక్క క్లిష్టతపై ఆధారపడుతుంది.

దశ 3: ఉమ్మడి రహస్యాన్ని లెక్కించడం

రెండు పరికరాలు ఒకదాని పబ్లిక్ కీని మరొకటి కనుగొన్న తర్వాత, అవి స్వతంత్రంగా అదే ఉమ్మడి రహస్యాన్ని:

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

లెక్కిస్తాయి. ఎలిప్టిక్ కర్వ్‌ల గణితం వల్ల, ప్రతి పరికరానికి తన ప్రైవేట్ కీ, మరొకదాని పబ్లిక్ కీ మాత్రమే తెలిసినా ఈ రెండు లెక్కింపుల ఫలితం ఒకటే వస్తుంది.

దశ 4: ధృవీకరణ సంఖ్య (SAS)

ఉమ్మడి రహస్యం నుంచి ఒక Short Authentication String (SAS) ఉత్పన్నమవుతుంది — రెండు పరికరాల్లో చూపించే రెండు అంకెల సంఖ్య:

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

రెండు పరికరాలూ ఒకే సంఖ్యను చూపిస్తాయి — ఉదాహరణకు, 42. వినియోగదారు రెండు స్క్రీన్‌లలోని సంఖ్యలు సరిపోతున్నాయా అని చూసి, తర్వాత ప్రతి పరికరంలో విడివిడిగా నిర్ధారిస్తారు.

దాడి చేసే వ్యక్తి దీన్ని ఎందుకు నకిలీ చేయలేడు

మ్యాన్-ఇన్-ది-మిడిల్ దాడి చేసే వ్యక్తి Firebaseలో కీ మార్పిడిని అడ్డుకోవాలి. అంటే, అతను ఇలా చేయాలి:

  1. Firestore డాక్యుమెంట్‌లోని అసలు పబ్లిక్ కీల స్థానంలో తన సొంత కీలను పెట్టడం
  2. ప్రతి పరికరంతో వేర్వేరు ఉమ్మడి రహస్యాలను ఏర్పరచడం
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)
      

SAS అసమతుల్యత ద్వారా మ్యాన్-ఇన్-ది-మిడిల్ గుర్తింపు — సవరించగల మూలం: docs/diagrams/mitm-detection.mmd

ఈ సందర్భంలో, దాడి చేసే వ్యక్తి పరికరం Aతో ఒక ఉమ్మడి రహస్యాన్ని S_A మరియు పరికరం Bతో వేరొక ఉమ్మడి రహస్యాన్ని S_B లెక్కిస్తాడు. ఎందుకంటే S_A ≠ S_B, పరికరాలు వేర్వేరు ధృవీకరణ సంఖ్యలను.

లెక్కిస్తాయి. దాడి చేసే వ్యక్తి సంఖ్యలు సరిపోలేలా చేయలేడు, ఎందుకంటే:

స్క్రీన్‌లలో వేర్వేరు సంఖ్యలు కనిపిస్తే, వినియోగదారు జతచేయడాన్ని రద్దు చేస్తారు. ఆ దశలో దాడి బయటపడిపోతుంది.

దశ 5: జతచేయడం పూర్తి చేయడం

వినియోగదారు రెండు పరికరాల్లో ధృవీకరణను నిర్ధారించిన తర్వాతే జతచేయడం పూర్తవుతుంది:

  1. ఒక 64-అక్షరాల జతచేయు కీ (256 బిట్లు) ఉమ్మడి రహస్యం నుంచి ఉత్పన్నమవుతుంది: SHA-256("pair:" + sharedSecret) → pairingKey
  2. డాక్యుమెంట్ కీని ఇలా ఉత్పన్నం చేస్తారు SHA-256("doc:" + pairingKey) మరియు అది Firestore డాక్యుమెంట్ కీగా పనిచేస్తుంది
  3. ఎన్‌క్రిప్షన్ కీని ఇలా ఉత్పన్నం చేస్తారు SHA-256("enc:" + pairingKey) మరియు అది ఎన్‌క్రిప్ట్ చేసిన సిగ్నలింగ్ కోసం AES-256-GCM కీని అందిస్తుంది
  4. రెండు పరికరాలు ఒకే జతచేయు కీని నిల్వ చేసి, మోడ్ ఎంపికకు వెళ్తాయి

ఈ దశ నుంచి, తదుపరి అన్ని కనెక్షన్ ప్రయత్నాలు (Firestore సిగ్నలింగ్, WebRTC సెటప్) ఉమ్మడి AES-256-GCM కీతో ఎన్‌క్రిప్ట్ అవుతాయి. జతచేయు కీని ఎప్పుడూ బ్యాకెండ్‌కు పంపరు; దాని SHA-256 హ్యాష్‌ను మాత్రమే డాక్యుమెంట్ గుర్తింపుదారుగా ఉపయోగిస్తారు.

సిస్టమ్ నిర్మాణం

కింది రేఖాచిత్రం జతచేయడం, కమ్యూనికేషన్‌లో పాల్గొనే భాగాలను చూపిస్తుంది:

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

సిస్టమ్ నిర్మాణం అవలోకనం — సవరించగల మూలం: docs/diagrams/pairing-architecture.mmd

కమ్యూనికేషన్ మార్గాల వివరాలు:

ప్రత్యామ్నాయం: కోడ్‌ను చేతితో నమోదు చేయడం

Bluetooth అందుబాటులో లేకపోతే (ఉదా., పాత పరికరాల్లో), 4-అక్షరాల కోడ్‌ను చేతితో కూడా టైప్ చేయవచ్చు. చేతితో నమోదు చేయడంలో అదే ECDH కీ మార్పిడి, అదే SAS ధృవీకరణను స్వయంచాలక జతచేయడం మాదిరిగానే ఉపయోగిస్తారు. తేడా ఒక్కటే: BLE ద్వారా కనుగొనబడటానికి బదులుగా, వినియోగదారు కోడ్‌ను చదివి టైప్ చేస్తారు.

రెండు సందర్భాల్లోనూ ECDH కీ మార్పిడి Firebase ద్వారా జరుగుతుంది కాబట్టి, భద్రత ఒకేలా ఉంటుంది. 4-అక్షరాల కోడ్ కలిసే చోటు మాత్రమే; అసలు ఎన్‌క్రిప్షన్ ECDH నుంచి ఉత్పన్నమయ్యే 256-బిట్ కీపై ఆధారపడి ఉంటుంది.

సారాంశం

భద్రతా విధానం దీనినుంచి రక్షిస్తుంది
ECDH కీ మార్పిడి (P-256) కీ మార్పిడి ట్రాఫిక్‌ను వినడం
తాత్కాలిక కీ జతలు ఫార్వర్డ్ సీక్రెసీ — గత జతచేయడాలు సురక్షితంగానే ఉంటాయి
దృశ్య ధృవీకరణ సంఖ్య (SAS) కీ మార్పిడి సమయంలో మ్యాన్-ఇన్-ది-మిడిల్ (MITM)
డాక్యుమెంట్ కీగా SHA-256 హ్యాష్ Firestore నుంచి కోడ్‌ను వెలికితీయడం
AES-256-GCM ఎన్‌క్రిప్షన్ సిగ్నలింగ్ డేటాను వినడం
రెండు వైపుల నిర్ధారణ వినియోగదారుకు తెలియకుండా ఒకే వైపు జతచేయడం
DTLS-SRTP (WebRTC) ఆడియో/వీడియోను వినడం

ఈ రక్షణ పొరలు కలిసి పనిచేస్తాయి: ECDH కీ మార్పిడిని, ధృవీకరణ సంఖ్య MITMను, AES-256-GCM సిగ్నలింగ్‌ను, WebRTC మీడియాను రక్షిస్తాయి. పరికరాలకు లేదా తల్లిదండ్రులకు తెలియకుండా దాడి చేసే వ్యక్తి ఈ గొలుసును అనేక చోట్ల ఛేదించాల్సి ఉంటుంది.


మరిన్ని వ్యాసాలు