SecretConf & SecretCall — Biztonsági leírás
Ez a dokumentum azt foglalja össze, hogyan működik a rendszer titkosítása, mit lát a szerver és mit nem, illetve mi ellen véd és mi ellen nem ez a megközelítés. Célközönsége a rendszert használó szakemberek (orvosok, ügyvédek, tanácsadók) és az ő ügyfeleik.
Rövid válasz
A beszélgetés hangja, videója, chatje és megosztott fájljai végponttól végpontig titkosítva vannak. A SecretConf szerver csak a titkosított bájtokat routolja a résztvevők között — sem az üzemeltető, sem aki hozzáfér a szerverhez, nem tudja a hívás tartalmát visszafejteni.
Ez alól az egyetlen kivétel az az elméleti eset, amikor a szerver aktívan, valós időben manipulálná a kódot vagy a kulcscserét (ún. MITM-támadás). Ez a webes E2EE általános korláta — Signal, WhatsApp webes változata és minden más ugyanebben a helyzetben van. A gyakorlatban ehhez a támadónak a szerver teljes kontrollja és kliens-oldali JS-injektálás képessége is kell, és ha ezt megteszi, akkor a titkosítás már nem tartható.
Mit titkosítunk és hogyan
Szállítási réteg (TLS / DTLS-SRTP)
- HTTPS: minden weboldali forgalom TLS-szel titkosítva (secretconf.com, secretcall.net, mindigorvos.hu).
- WebSocket (Socket.io): TLS-en fut (wss), az Nginx reverse proxy terminálja.
- WebRTC média: DTLS-SRTP a kliens és a LiveKit szerver között. Ez mindig ott van, E2EE nélkül is.
Végponttitkosítás (E2EE)
Ez az érdekes része. A SecretConf LiveKit-et használ SFU-ként (Selective Forwarding Unit). Alapból egy SFU felbontja a szállítási titkosítást, újrakódolja, és úgy küldi tovább — ilyenkor a szerveren a média egy pillanatra visszafejtett állapotban van. Ez nem igazi E2EE.
Mi ezen felül frame-szintű végponttitkosítást rakunk rá a LiveKit InsertableStreams API-val és ExternalE2EEKeyProvider-rel. A hang- és videócsomagok minden egyes frame-je a kliensen titkosítódik egy közös AES-GCM kulccsal, mielőtt a LiveKit SFU-ba érnének. A szerver csak titkosított bájtokat lát — nem tudja visszafejteni.
Hogyan jön létre a közös kulcs (kulcscsere)
A kulcsot nem a szerver generálja és nem is a szerveren fordul meg.
SecretCall / secretcall.net (1:1 biztonságos hívás):
1. Mindkét fél böngészője generál egy ephemer ECDH (P-256) kulcspárt a böngésző WebCrypto API-jával.
2. A publikus kulcsot átküldik egymásnak a Socket.io jelzőcsatornán.
3. Mindkét oldal egymástól függetlenül kiszámolja ugyanazt a közös titkot a saját privát kulcsából és a másik publikus kulcsából (Diffie-Hellman alapelv).
4. A közös titokból HKDF-SHA-256-tal 256 bites AES-GCM kulcs derivál.
5. Ezt a kulcsot kapja a LiveKit E2EE keyProvider.
Miért nem tudja kiszámolni a szerver? Mert nincs meg neki egyik fél privát kulcsa sem, csak a két publikus kulcs. A publikus kulcsokból a közös titkot kiszámolni a Diffie-Hellman probléma — nem megoldható észszerű időn belül.
SecretConf / MindigOrvos szobák (1 host + max 10 résztvevő):
1. A hozzáférést kezdeményező fél (orvos / ügyvéd / tanácsadó) böngészője generál egy véletlen 256 bites master keyt, amit csak ő tárol.
2. Amikor egy új résztvevő belép, a böngészői között ECDH kulcscserét végeznek (ugyanúgy, mint a /hivas esetén).
3. A host a közös ECDH-titokból AES-GCM kulcsot derivál, és ezzel titkosítva küldi át a master keyt az új résztvevőnek a Socket.io-n.
4. Az új résztvevő kibontja, és ugyanazt a master keyt adja a saját LiveKit E2EE keyProvider-ének.
5. Mindenki azonos master keyt használ → a LiveKit szerveren fordul meg a média, de csak titkosítva.
Mit lát a szerver és mit nem
| Információ | Látja a szerver? |
|---|---|
| Hogy hívás történt | igen (a jelzés átmegy rajta) |
| Ki kivel beszél (identity-k, IP) | igen (metaadat, ez szükséges a routoláshoz) |
| Hívás hossza | igen |
| Hang tartalma | nem (E2EE titkosítva) |
| Videó tartalma | nem (E2EE titkosítva) |
| Chat üzenetek | nem (LiveKit data channel, E2EE titkosítva) |
| Megosztott fájlok a híváson belül | nem (E2EE titkosítva) |
| Képernyőmegosztás | nem (E2EE titkosítva) |
| ECDH publikus kulcsok | igen (de a privátokat nem) |
| Titkosított master key csomag | igen (de AES-GCM védi, a wrapping kulcsot nem tudja kiszámolni) |
Mi ellen véd ez és mi ellen nem
✅ Amitől megvéd
- Passzív lehallgatás a szerveren — logok, memory dump, backup, hálózati csomag-sniffing: a tartalom ezekben is titkosított.
- Ellopott szerver / adatszivárgás — mondjuk valaki ellopja a szerver merevlemezét: nem tud belehallgatni a korábbi beszélgetésekbe.
- Rosszindulatú üzemeltetői kontroll, passzív esetben — ha valaki admin-jogot szerez a szerveren, a futó hívás médiáját akkor sem tudja visszafejteni, mert a kulcs nem fordul meg a szerveren.
- Jogalap nélküli hozzáférési kísérletek — bírósági végzéssel a szerver-üzemeltető csak a metaadatot tudja kiadni (kik, mikor, meddig), a tartalmat nem, mert nincs nála.
- Hálózati MITM a szerver és a kliens között — a TLS + DTLS-SRTP megoldja.
⚠️ Ami ellen nem véd (vagy csak részben)
- Aktív, real-time MITM a szerverről. Ha a szervert olyan szintű kompromittálás éri, hogy a támadó valós időben le tudja cserélni a kliens oldali JS-t vagy manipulálni tudja a kulcscsere üzeneteket, akkor technikailag képes "középre állni". Ez minden webes E2EE közös problémája (Signal web, WhatsApp web, Google Meet is). Mi ezen a ponton rá vagyunk utalva a szerver fizikai és szoftveres biztonságára.
- Megfertőzött végpont. Ha a felhasználó böngészőjébe rosszindulatú bővítmény kerül, vagy a telefonján malware fut, az olvasni tudja a mikrofont, képernyőt, chatet. Ez az E2EE általános korlátja — Signal, WhatsApp sem véd ez ellen.
- Feltört Google / Apple fiók. A hozzáférés a SecretConf-on a Google vagy Apple fiók OAuth-hitelesítésén keresztül megy. Ha valaki hozzáfér a felhasználó Google/Apple fiókjához (pl. ellopja a jelszót + 2FA-t), be tud lépni a SecretConf-ra is. Ez nem a hívás titkosításának gyengesége, hanem az autentikációé — érdemes 2FA-t kapcsolni a Google/Apple fiókhoz.
- Képernyőfotó / képernyőfelvétel a másik oldalról. Ha a partner felveszi vagy lefotózza a hívást, arról a rendszer nem tud. Ugyanez érvényes egy telefonhívásra vagy személyes találkozásra is.
Hitelesítés (ki kicsoda)
- Host-ok (orvosok, ügyvédek, SecretConf felhasználók) — Google vagy Apple OAuth-alapú belépés. Nincs külön jelszó a SecretConf-nál, nincs külön regisztrációs adat. A felhasználó az identitás-szolgáltatóján (Google/Apple) keresztül azonosítja magát.
- Vendégek / páciensek — 6 jegyű szobakóddal (SecretConf) vagy 4 jegyű hívásszámmal (SecretCall) csatlakoznak. Nincs regisztráció, nincs fiók. A kódok egyediek és csak a nyitott szobára érvényesek.
GDPR kontextus
- Adatfeldolgozás alapja: GDPR 6. cikk (1) b) — szerződés teljesítése (szolgáltatás igénybevétele).
- Tárolt adatok: user fiókok (SecretConf/MindigOrvos), szobák metadata (létrehozás, lezárás idő), nem-tartalom logok (kik, mikor csatlakoztak).
- Nem tárolt adatok: a hívás hang-, videó-, chat- vagy képernyőmegosztás tartalma sehol, semmilyen formában. (Szerveroldali felvétel nincs, és nem is lenne technikailag értelmes, mert a tartalom titkosított a szerver felé.)
- Adatfeldolgozó szerepkör: mivel a tartalomhoz nem férünk hozzá, sok forrás a hasonló szolgáltatókat (Zoom EE-mód, Signal) "post processor" vagy "csatornás szolgáltató" kategóriába sorolja. Az ügyvédi/orvosi titoktartás nem sérül, mert a szerver és üzemeltetője strukturálisan nem fér a titokhoz.
Technikai hivatkozások
- LiveKit E2EE: LiveKit dokumentáció — End-to-end encryption
- Insertable Streams: W3C Editor's Draft
- WebCrypto ECDH: MDN dokumentáció
- OAuth 2.0 / OpenID Connect: Google Identity, Sign in with Apple
Böngészőtámogatás
- Chrome / Edge: 94+ (2021 szeptember óta)
- Firefox: 117+ (2023 augusztus óta)
- Safari: 15.4+ (2022 március óta)
Régebbi böngészővel a rendszer nem engedi a hívást — fail-closed működés, inkább megszakad a kapcsolat, mint hogy titkosítás nélkül jöjjön létre.
Kapcsolat
Ha kérdésed van a rendszer biztonságáról, írj az üzemeltetőnek — az impresszum és az adatkezelési tájékoztató tartalmazza az elérhetőségeket.