Files
Kecalek_python/gemini.md
Filip 2e7b72307d Initial commit — encrypted chat server + Python clients (v0.8.5)
E2E encrypted chat (X3DH + Double Ratchet, Signal Protocol).
Server: asyncio TCP + TLS, MySQL. Clients: PyQt6 GUI + CLI.
Secrets (.env, TLS keys, Cloudflare token), runtime data and
mobile clients (separate repos) are gitignored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 18:22:39 -04:00

8.8 KiB

Gemini Advanced Roadmap: Beyond the Basics

Tento dokument obsahuje pokročilé návrhy na vylepšení bezpečnosti, architektury a UX aplikace encrypted_chat. Tyto body jdou nad rámec běžného "best practice" a směřují k funkcionalitě profesionálních secure messengerů (Signal, Threema, Wire) se zaměřením na ochranu metadat a anti-forenzní techniky.


1. Ochrana Metadat & Traffic Analysis Resistance

Cíl: Server by neměl vědět, KDO s KÝM komunikuje, ani JAKÝ typ dat si posílají.

Sealed Sender (Odesílatel v obálce)

  • Koncept: Server zná pouze recipient_id. Identita odesílatele (sender_id) je zašifrována uvnitř zprávy (v "obálce"), kterou server nedokáže přečíst.
  • Implementace:
    1. Odesílatel vygeneruje klíč pro obálku (např. z profilu příjemce).
    2. Zabalí sender_id a payload do šifrovaného bloku.
    3. Server doručí blob příjemci bez ověření odesílatele (ověření proběhne až na klientovi po rozbalení).
    4. Výhoda: Při kompromitaci serveru útočník nevidí sociální graf (kdo se s kým baví).

Traffic Padding & Constant Bitrate

  • Problém: Délka paketu prozrazuje obsah (krátký paket = "Ahoj", dlouhý paket = obrázek/klíč). Intervaly prozrazují aktivitu.
  • Řešení:
    1. Padding: Všechny zprávy doplňovat náhodnými daty na fixní velikosti (např. bloky 4KB).
    2. Dummy Traffic (Chaff): Klient náhodně odesílá "falešné" pakety na server, které server zahodí nebo vrátí (echo).
    3. Výhoda: Pro síťového analytika (ISP) vypadá tok dat jako konstantní šum.

2. Anti-Forenzní Ochrana (Client-side)

Cíl: Minimalizovat dopad fyzického zabavení zařízení nebo vynuceného odemčení.

Duress Password (Heslo pod nátlakem)

  • Funkce: Uživatel si nastaví druhé heslo.
  • Chování: Pokud se přihlásí tímto heslem:
    • Varianta A (Decoy): Odemkne se prázdná nebo falešná databáze s neškodnými konverzacemi.
    • Varianta B (Panic): Aplikace na pozadí tiše provede secure wipe (přepis) privátních klíčů a reálné DB, zatímco uživateli zobrazí "Connection Error".

Secure Deletion & DB Vacuuming

  • Problém: SQL DELETE data nesmaže fyzicky, jen označí místo jako volné.
  • Řešení:
    1. Před smazáním zprávy přepsat obsah náhodnými byty (UPDATE messages SET content = random_blob WHERE id = ...).
    2. Pravidelně spouštět VACUUM (u SQLite) nebo optimalizaci tabulek.
    3. Pro soubory (obrázky) použít bezpečné mazání (overwrite passes) před os.unlink().

Disappearing Messages (TTL)

  • Funkce: Odesílatel nastaví životnost zprávy (např. 1 minuta).
  • Implementace: Odpočet začíná okamžikem zobrazení (Read Receipt). Po uplynutí času klient data nenávratně smaže z disku (včetně secure wipe). Server maže ihned po doručení.

3. Infrastruktura & Škálování

Cíl: Odlehčit Python procesu a databázi pro podporu tisíců uživatelů.

Object Storage (MinIO / S3) + Presigned URLs

  • Problém: server.py blokuje I/O při příjmu velkých souborů.
  • Řešení:
    1. Klient požádá server o upload.
    2. Server vygeneruje Presigned PUT URL (časově omezený token pro přímý upload do MinIO/S3).
    3. Klient nahrává data přímo do úložiště (obchází aplikační server).
    4. Server ukládá pouze odkaz (URL/Key).
  • Výhoda: Masivní zrychlení, server řeší jen metadata.

Read/Write Splitting (MySQL Replication)

  • Architektura:
    • Master DB: Pouze pro INSERT, UPDATE, DELETE.
    • Read Replicas (Slaves): Pro těžké SELECT dotazy (historie zpráv, hledání).
  • Implementace v db.py: Router, který podle typu dotazu volí connection pool.

4. Protokol & Funkce

Cíl: Rozšíření možností komunikace bez nutnosti centralizovaného streamování.

P2P Volání (WebRTC Signalizace)

  • Koncept: Využít existující bezpečný kanál (Double Ratchet) pro výměnu SDP (Session Description Protocol) paketů.
  • Flow:
    1. Alice pošle Bobovi zašifrovanou zprávu typu CALL_OFFER s parametry WebRTC.
    2. Bob odpoví CALL_ANSWER.
    3. Klienti si vymění ICE_CANDIDATES (IP adresy/porty) a naváží přímé P2P spojení (UDP).
    4. Audio/Video stream (SRTP) jde mimo server.

Diferenciální Synchronizace (Merkle Trees)

  • Problém: Stahování seznamu kontaktů (get_user_contacts) je pomalé při velkém množství dat.
  • Řešení: Klient a server si udržují Hash Tree (Merkle Tree) stavu. Při synchronizaci porovnají pouze root hash. Pokud se liší, stahují se jen změněné větve stromu (delta update).

5. UI/UX (PyQt Speciality)

Cíl: Ochrana soukromí na úrovni OS a skrytá komunikace.

Privacy Overlay (Task Switcher)

  • Funkce: Detekovat událost ztráty fokusu okna (QEvent.WindowDeactivate) nebo minimalizace.
  • Akce: Překrýt obsah okna rozmazaným efektem (QGraphicsBlurEffect) nebo logem aplikace.
  • Důvod: Zabrání operačnímu systému (Windows/Linux/macOS) vytvořit čitelný náhled okna v Alt+Tab menu nebo v historii aktivit.

Steganografie

  • Funkce: Ukrýt šifrovanou zprávu do obrazových dat nevinného obrázku (např. meme kočky).
  • Implementace: Modifikace LSB (Least Significant Bit) pixelů obrázku.
  • Výhoda: Pro síťového admina nebo forenzní analýzu to vypadá jako běžné posílání obrázků, přítomnost šifrované komunikace je popiratelná.

6. High Availability Architecture (Distribuovaný Cluster)

Cíl: Zajištění provozu i při výpadku/napadení serveru (Active-Active "RAID 1 přes síť").

Architektura: Geograficky Distribuovaný "Zero-Trust" Cluster

1. Vstupní brána (Global Traffic Manager)

  • Funkce: Rozděluje klienty mezi dostupné servery (Round Robin / Geo-DNS).
  • Self-Healing: Při výpadku Serveru A okamžitě přesměruje provoz na Server B. Uživatel nic nepozná.

2. Aplikační vrstva (Stateless Servers)

  • Stav: Servery jsou bezstavové. server.py neukládá nic důležitého v RAM.
  • Škálování: Můžete spustit N instancí serveru. Je jedno, ke kterému se uživatel připojí.
  • Komunikace: Servery spolu mluví přes rychlý Message Bus (Redis Pub/Sub) pro doručování real-time zpráv mezi uživateli na různých uzlech.

3. Datová vrstva (Zrcadlení Dat - "RAID 1")

  • Databáze (MySQL Galera Cluster): Synchronní multi-master replikace. Zápis na Serveru A se potvrdí, až když je fyzicky zapsán i na Serveru B (a C).
    • Efekt: Ztráta serveru neznamená ztrátu dat (klíčů, zpráv).
  • Soubory (MinIO Cluster): Distribuovaný Object Storage s Erasure Coding. Soubory jsou matematicky rozprostřeny přes všechny servery. Výpadek disku/serveru nevadí.

4. Bezpečnostní pojistky ("Poisoned Node")

  • Soft Delete: Databáze nemaže data ihned, ale označuje je jako smazané (ochrana proti DELETE * od útočníka).
  • Client-Side Verification: I kdyby kompromitovaný server posílal podvržené klíče, klienti ověřují digitální podpisy (Identity Keys). Server nemůže zfalšovat identitu uživatelů.

7. Technický Upgrade pro Stateless Architekturu

Cíl: Odstranit závislost na paměti procesu (RAM) pro umožnění horizontálního škálování.

1. Redis jako Distribuovaná Paměť

Nahrazení Python dict struktur, které jsou lokální pro jeden proces, za centrální Redis úložiště přístupné všem serverům.

  • Párovací Session:
    • Stav: pairing_sessions (dict) -> Redis Key pair:{code} (Hash/String s TTL).
    • Efekt: Uživatel může vyžádat kód na Serveru A a potvrdit ho na Serveru B.
  • Rate Limiting:
    • Stav: rate_limits (dict) -> Redis Key rl:{ip}:{action} (Counter s EXPIRE).
    • Efekt: Limity platí globálně pro celý cluster, ne jen per server.

2. Redis Pub/Sub pro Real-Time Routing

Doručení zprávy uživateli, který je připojen k JINÉMU serveru než odesílatel.

  • Princip:
    1. Server A (odesílatel) zjistí, že příjemce Bob není připojen lokálně.
    2. Server A publikuje zprávu do Redis kanálu user:{bob_user_id}.
    3. Server B (kde je Bob připojen) tento kanál poslouchá (subscribe).
    4. Server B přijme zprávu z Redisu a pošle ji Bobovi do otevřeného TCP socketu.

3. Session Sticky vs. Stateless Uploads

Řešení pro nahrávání souborů po částech (chunks).

  • Varianta A (Infrastructure - Sticky Sessions): Load Balancer (HAProxy/Nginx) zajistí, že všechny požadavky od jedné IP jdou vždy na stejný server. Nejjednodušší, nevyžaduje změnu kódu.
  • Varianta B (Architectural - Direct Upload): Viz bod 3 "Object Storage + Presigned URLs". Server vůbec nepřijímá data souboru, pouze vygeneruje token. Plně stateless řešení.