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)పై రూపొందిస్తుంది:
- ఒక ప్రైవేట్ కీ — పరికరంలోనే ఉంటుంది
- ఒక పబ్లిక్ కీ — Firebase ద్వారా మార్పిడి అవుతుంది
కీలు క్రిప్టోగ్రఫీకి సురక్షితమైన యాదృచ్ఛిక సంఖ్య జనరేటర్తో (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లో కీ మార్పిడిని అడ్డుకోవాలి. అంటే, అతను ఇలా చేయాలి:
- Firestore డాక్యుమెంట్లోని అసలు పబ్లిక్ కీల స్థానంలో తన సొంత కీలను పెట్టడం
- ప్రతి పరికరంతో వేర్వేరు ఉమ్మడి రహస్యాలను ఏర్పరచడం
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,
పరికరాలు వేర్వేరు ధృవీకరణ సంఖ్యలను.
లెక్కిస్తాయి. దాడి చేసే వ్యక్తి సంఖ్యలు సరిపోలేలా చేయలేడు, ఎందుకంటే:
- పరికరాల ప్రైవేట్ కీలు వారికి తెలియవు
- SHA-256ని తిరగదీయలేరు
- యాదృచ్ఛికంగా సరిపోలే అవకాశం కేవలం 100లో 1
స్క్రీన్లలో వేర్వేరు సంఖ్యలు కనిపిస్తే, వినియోగదారు జతచేయడాన్ని రద్దు చేస్తారు. ఆ దశలో దాడి బయటపడిపోతుంది.
దశ 5: జతచేయడం పూర్తి చేయడం
వినియోగదారు రెండు పరికరాల్లో ధృవీకరణను నిర్ధారించిన తర్వాతే జతచేయడం పూర్తవుతుంది:
- ఒక 64-అక్షరాల జతచేయు కీ (256 బిట్లు) ఉమ్మడి రహస్యం నుంచి ఉత్పన్నమవుతుంది:
SHA-256("pair:" + sharedSecret) → pairingKey - డాక్యుమెంట్ కీని ఇలా ఉత్పన్నం చేస్తారు
SHA-256("doc:" + pairingKey)మరియు అది Firestore డాక్యుమెంట్ కీగా పనిచేస్తుంది - ఎన్క్రిప్షన్ కీని ఇలా ఉత్పన్నం చేస్తారు
SHA-256("enc:" + pairingKey)మరియు అది ఎన్క్రిప్ట్ చేసిన సిగ్నలింగ్ కోసం AES-256-GCM కీని అందిస్తుంది - రెండు పరికరాలు ఒకే జతచేయు కీని నిల్వ చేసి, మోడ్ ఎంపికకు వెళ్తాయి
ఈ దశ నుంచి, తదుపరి అన్ని కనెక్షన్ ప్రయత్నాలు (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
కమ్యూనికేషన్ మార్గాల వివరాలు:
- WebRTC పీర్-టు-పీర్ (మందమైన గీత): ఆడియో, వీడియో, DataChannel నేరుగా పరికరాల మధ్య ప్రవహిస్తాయి — DTLS-SRTPతో ఎన్క్రిప్ట్ అవుతాయి. ఏ సర్వర్కూ ఈ డేటా కనిపించదు.
- Firebase Firestore (దృఢ గీత): జతచేయు డేటా (ECDH కీలు), సిగ్నలింగ్ (SDP/ICE) Firestore ద్వారా వెళ్తాయి — AES-256-GCMతో ఎండ్-టు-ఎండ్ ఎన్క్రిప్ట్ అవుతాయి. Firebase ఈ డేటాను డీక్రిప్ట్ చేయలేడు.
- STUN సర్వర్: నేరుగా పీర్-టు-పీర్ కనెక్షన్ ఏర్పడేందుకు, రెండు పరికరాలూ తమ పబ్లిక్ IP చిరునామాను కనుగొంటాయి.
- TURN రిలే: నేరుగా కనెక్షన్ సాధ్యం కాకపోతే (ఉదా., మొబైల్ డేటాలో), ఎంచుకున్న స్థానిక లేదా Cloudflare TURN సర్వర్ ఎన్క్రిప్ట్ చేసిన మీడియాను రిలే చేస్తుంది. తక్కువ కాలం చెల్లే క్రెడెన్షియల్స్ (24h)ను Firebase Cloud Functions ద్వారా తీసుకుంటారు.
- Bluetooth LE (చుక్కల గీత): Nearby Connections దగ్గరలోని పరికరాలను స్వయంచాలకంగా కనుగొంటుంది — కలిసే కోడ్ మాత్రమే పంపబడుతుంది, కీ మెటీరియల్ పంపబడదు.
ప్రత్యామ్నాయం: కోడ్ను చేతితో నమోదు చేయడం
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 మీడియాను రక్షిస్తాయి. పరికరాలకు లేదా తల్లిదండ్రులకు తెలియకుండా దాడి చేసే వ్యక్తి ఈ గొలుసును అనేక చోట్ల ఛేదించాల్సి ఉంటుంది.