Zpět na domů

ONYX messenger: E2EE a LAN bez internetu

ONYX — multiplatformní self-hosted messenger s E2EE na XChaCha20-Poly1305 a LAN režimem přes UDP broadcast. Podporuje multiděvice, externí instance pro skupiny/kanály. Klient na Flutter optimalizován pro 60 FPS na desktopu a mobilech.

ONYX: messenger s LAN a plným E2EE šifrováním
Advertisement 728x90

ONYX: samostatný messenger s E2EE a offline LAN režimem

Messenger ONYX nabízí vyvážený přístup mezi jednoduchostí nasazení a funkcionalitou: server na Node.js s MariaDB a Redis, klient na Flutter pro Android, Windows, macOS a Linux. Podporuje plné end-to-end šifrování založené na X25519 a XChaCha20-Poly1305, plus unikátní režim práce v lokální síti bez internetu prostřednictvím UDP broadcastu.

Architektura a technologický stack

Server je postaven na Express s WebSocket (express-ws + ws), databáze je MariaDB pro data a Redis pro relace/kachování. Soubory jsou uloženy ve S3 kompatibilním úložišti přes AWS SDK v3. Přenos: wss:// a HTTP/REST. Šifrování používá X25519 pro výměnu klíčů, XChaCha20-Poly1305 pro zprávy a AES-256-GCM pro média v LAN.

Klíčové výhody XChaCha20-Poly1305 oproti AES-GCM:

Google AdInline article slot
  • Konstantní čas provádění bez závislosti na AES-NI.
  • Rozšířený nonce (192 bitů vs 96), minimalizuje kolize v dlouhých relacích.

Formát zašifrovaného balíčku: [pubkey 32B] [nonce 12B] [ciphertext] [mac 16B].

LAN režim: automatické zjištění a výměna bez internetu

Klienti každých 5 sekund posílají UDP broadcast na 255.255.255.255:45678 s JSON:

{
  "username": "alice",
  "timestamp": 1710000000000,
  "pubkey": "<X25519 public key, base64>"
}

Přijímající klienti aktualizují tabulky username → IP a username → pubkey. Bez mDNS, ručního zadání IP nebo dalšího handshake – šifrování se spustí okamžitě.

Google AdInline article slot

Média se přenáší částmi po ~32 KB na portu 45679, každá část je zašifrovaná nezávisle AES-256-GCM. Dekódování a zobrazení začíná již části.

Multidevice s zachováním E2EE

Nové zařízení požaduje autorizaci od důvěryhodného. Po schválení probíhá výměna klíčů. Server nevidí plaintext.

V soukromých chatu server posílá zašifrované kopie zpráv na každé zařízení uživatele (odděleně podle pubkey zařízení). Synchronizují se pouze příchozí: odchozí jsou viditelné pouze na odesílacím zařízení. Toto je kompromis bez ohrožení bezpečnosti.

Google AdInline article slot

Derivace klíčů: HKDF-SHA256 s etiketami (onyx-lan-v2 pro LAN, odděleně pro chaty).

Křížovoplatforemní klient na Flutter

Jednotný kódový základ pro 4 platformy. Flutter s Skia/Impeller zajišťuje 60 FPS bez DOM. Optimalizace pro desktop:

  • fps_booster, fps_optimizer, fps_stimulator.
  • message_load_optimizer, chat_preloader.

Desktopové funkce:

  • Soustavný systémový panel s minimalizací.
  • Single-instance prostřednictvím IPC.
  • Vlastní titlebar s drag-zónou.
  • Nativní upozornění na Windows.

Bezpečnost mimo E2EE

  • PIN/ biometrie přes Flutter Secure Storage.
  • Podpora proxy (proxy_manager.dart).
  • Zabezpečené úložiště: Keychain/Android Keystore.
  • Správa relací: prohlížení a odstranění z důvěryhodného zařízení.

Účty: pouze username + heslo, bez telefonního čísla nebo e-mailu. Username nelze změnit, více účtů v aplikaci, kompletní odstranění dat.

Skupiny, kanály a samostatné instance

Vnitřní skupiny/kanály přes ONYX-server – bez E2EE pro synchronizaci.

Externí samostatné instance:

  • Lokální síť: sdílení souborů a chat bez internetu.
  • Soukromá komunita na VPS na pozvánku.
  • Veřejný kanál s přihlášením na pozvánku.

Připojení: zadání adresy na external_server_join_screen. Nasazení: ONYX Server.

Skupiny: dvousměrné. Kanály: pouze správci.

Místní úložiště «Oblíbené»

Karta pro poznámky/kategorie (hesla, média, odkazy). Uloženo pouze místně, bez synchronizace ani serverového přístupu.

Důležité:

  • LAN bez internetu: UDP broadcast + částové média.
  • E2EE stack: X25519, XChaCha20-Poly1305, relační klíče.
  • Multidevice: šifrování podle zařízení, autorizace.
  • Flutter: optimalizované UI 60 FPS na všech platformách.
  • Samostatné nasazení: externí instance pro skupiny/kanály.

Projekt je ve verzi beta, vhodný pro soukromé komunikace a lokální sítě.

— Editorial Team

Advertisement 728x90

Číst dál