Dokumentácia popisuje MVP fázu projektu. Niektoré features sú TBD.
ADR (rozhodnutia)
ADR-008 · E2E len pre direct

ADR-008 · End-to-end šifrovanie len pre direct chat

Status: ✅ Accepted Dátum: 2026-04-27 Rozhodli: Návrhová fáza (Jan Letko, asistent) Súvisí s: ADR-009, Q-017

Kontext

Chat (Courier) je citlivá oblasť. Tréner s rodičom riešia osobné veci dieťaťa, mentor s mentee diskutujú výkon, lekár s pacientom zdravotný stav. Šifrovanie je potreba.

Typy konverzácií:

  • Direct (1:1) — dvaja účastníci, žiadna moderácia, súkromie absolútne
  • Group (3+) — tímové chaty, klubové oznamy, realizačný tím; admin organizácie môže potrebovať moderovať
  • Broadcast — klubové oznamy fanúšikom, komisia rozhodcom; verejnejšie, žiadne tajomstvá

Otázka: end-to-end šifrovanie pre všetky, alebo len pre niektoré?

Rozhodnutie

End-to-end šifrovanie len pre direct (1:1) konverzácie.

Group a broadcast konverzácie sú server-side šifrované (encryption at rest), ale server má kľúč a admin môže pri pravnej potrebe (subpoena) alebo moderation prečítať obsah.

Alternatívy, ktoré sme zvážili

  • (A) E2E pre všetky typy — najtvrdšia privacy. Cons: žiadna moderation, žiadne backup keyword search, pri strate device-u stratiš history. Pre tímový chat U13 je to overkill — všetci účastníci by museli držať kľúče, rodičia by stratili history pri zmene mobilu.
  • (B) Žiadne E2E, len server-side — najjednoduchšie. Cons: server má prístup k všetkým intímnym konverzáciám medzi mentor-mentee, lekár-pacient. Privacy nedostatočná.
  • (C) E2E len pre direct ✅ — kompromis. Najcitlivejšie konverzácie sú E2E, group/broadcast sú moderovateľné.

Dôsledky

Pozitíva

  • Direct chat je technicky súkromný — server vidí len ciphertext, ani admin nečíta
  • Group chat je moderovateľný — admin môže riešiť harassment, šikanu (pre tímový chat U13 to je dôležité — rodičia očakávajú, že klub vie zasiahnuť)
  • Broadcast chat je searchable — fanúšik si môže vyhľadávať klubové oznamy
  • Backup a recovery sú možné pre group/broadcast (server môže reindexovať)

Negatíva

  • Komplexnosť implementácie — direct chat má iný code path než group/broadcast. Dva systémy.
  • Direct chat features obmedzené — full-text search nie je možný (server nevidí obsah). Cross-device sync vyžaduje key transfer protocol.
  • Mental model pre používateľov — UI musí jasne komunikovať: "Tento chat je súkromný, nikto okrem teba a Petra ho nečíta" vs "Tento tímový chat môže prečítať admin klubu".

Riziká

  • Strata kľúča v direct chat = strata history — používateľ stratí mobil, nemá backup, history zmizla. Mitigácia: server-stored encrypted backup s passphrase (užívateľ si nastaví), recovery flow.
  • Forward secrecy — ak je kľúč kompromitovaný, mali by historické správy zostať bezpečné. Vyžaduje ratcheting protocol (Signal-style). Mitigácia: použiť libsignal alebo Olm/Megolm.
  • Rodičovský proxy v direct — keď dieťa po 16. roku má direct chat s odborníkom, rodič musí mať read-only prístup. Tento konflikt s E2E je riešený v ADR-009 cez trojhľadový kľúč.

Implementačné poznámky

Direct chat:

  • Klient generuje identity key pair pri registrácii
  • Pre konverzáciu: klient A si vyzdvihne public key klienta B z servera, derives session key cez X3DH protocol
  • Správy sú šifrované Megolm/Olm (Matrix protocol) alebo libsignal Double Ratchet
  • Server vidí len: {from, to, ciphertext, timestamp}

Group chat:

  • Server generuje conversation key, šifruje správy AES-256-GCM
  • Key je v Mongo collection s prísnou ACL
  • Členovia sa autentifikujú voči serveru, server dešifruje pri delivery
  • Pri pridaní nového člena: nová conversation key, staré správy zostávajú zašifrované starým kľúčom (nový člen nevidí historiu)

Broadcast:

  • Žiadne šifrovanie obsahu — broadcast je verejnejší
  • Encryption at rest na úrovni MongoDB (transparent disk encryption)

Otvorené otázky

  • Konkrétny E2E protokol — Signal Protocol vs Olm/Megolm vs custom. Viď Q-017.
  • Key backup mechanism — pre stratu device-u
  • Cross-device sync — keď používateľ má mobil + laptop, ako synchronizovať session keys?