Powrót do strony głównej

ONYX komunikator: E2EE i LAN bez internetu

ONYX — wieloplatformowy self-hosted komunikator z E2EE na XChaCha20-Poly1305 i trybem LAN przez UDP broadcast. Obsługuje wielourządzeniowość, zewnętrzne instancje dla grup/kanałów. Klient na Flutter zoptymalizowany dla 60 FPS na desktopie i mobilnych.

ONYX: komunikator z LAN i pełnym szyfrowaniem E2EE
Advertisement 728x90

ONYX: samodzielny messenger z szyfrowaniem E2EE i trybem LAN

Messenger ONYX oferuje idealne połączenie prostoty wdrożenia i zaawansowanej funkcjonalności: serwer na Node.js z MariaDB i Redis, klient na Flutter dla Androida, Windows, macOS i Linux. Obsługuje pełne szyfrowanie end-to-end oparte na X25519 i XChaCha20-Poly1305, a także unikalny tryb pracy w lokalnej sieci bez dostępu do internetu przez broadcast UDP.

Architektura i stos technologiczny

Serwer wybudowany jest na Express z WebSocket (express-ws + ws), baza danych to MariaDB do przechowywania danych oraz Redis do sesji i buforowania. Pliki są przechowywane w magazynie kompatybilnym z S3 poprzez AWS SDK v3. Transport: wss:// i HTTP/REST. Szyfrowanie wykorzystuje X25519 do wymiany kluczy, XChaCha20-Poly1305 do wiadomości oraz AES-256-GCM do mediów w sieci LAN.

Kluczowe zalety XChaCha20-Poly1305 w porównaniu do AES-GCM:

Google AdInline article slot
  • Stały czas działania niezależnie od obecności rozszerzenia AES-NI.
  • Rozszerzony nonce (192 bity vs 96), co minimalizuje kolizje w długich sesjach.

Format zaszyfrowanego pakietu: [pubkey 32B] [nonce 12B] [ciphertext] [mac 16B].

Tryb LAN: automatyczne wykrywanie i wymiana bez internetu

Klienci co 5 sekund wysyłają broadcast UDP na 255.255.255.255:45678 z JSON-em:

{
  "username": "alice",
  "timestamp": 1710000000000,
  "pubkey": "<publiczny klucz X25519, base64>"
}

Odbierający klienci aktualizują tabele username → IP oraz username → pubkey. Bez mDNS, ręcznego wpisywania adresów IP ani dodatkowych handshake’ów — szyfrowanie rozpoczyna się natychmiast.

Google AdInline article slot

Media przesyłane są porcjami ok. 32 KB przez port 45679, każda część szyfrowana jest niezależnie przez AES-256-GCM. Deszyfrowanie i renderowanie zaczynają się już częściowo.

Wielo urządzeniowość z zachowaniem E2EE

Nowe urządzenie żąda autoryzacji od zaufanego. Po zatwierdzeniu — następuje wymiana kluczy. Serwer nie widzi tekstu jawnego.

W czatach prywatnych serwer wysyła zaszyfrowane kopie wiadomości do każdego urządzenia użytkownika (oddzielnie pod publicznym kluczem urządzenia). Synchronizowane są tylko wiadomości przychodzące: wychodzące są widoczne wyłącznie na urządzeniu nadającym. To kompromis bez naruszenia bezpieczeństwa.

Google AdInline article slot

Derwacja kluczy: HKDF-SHA256 z etykietami (onyx-lan-v2 dla trybu LAN, osobno dla czatów).

Klient wieloplatformowy na Flutterze

Jedna baza kodu dla 4 platform. Flutter z Skia/Impeller zapewnia płynność 60 FPS bez DOM. Optymalizacje dla stacjonarnych:

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

Funkcje dla komputerów:

  • Systemowy pasek zminimalizowany do tła.
  • Tryb single-instance przez IPC.
  • Niestandardowa pasek tytułu z obszarami przeciągania.
  • Natywne powiadomienia na Windowsie.

Bezpieczeństwo poza E2EE

  • PIN i biometria przez Flutter Secure Storage.
  • Obsługa proxy (proxy_manager.dart).
  • Bezpieczne przechowywanie: Keychain/Android Keystore.
  • Zarządzanie sesjami: przegląd i usuwanie z zaufanego urządzenia.

Konta: tylko username + hasło, bez numeru telefonu czy e-maila. Nazwa użytkownika nie da się zmienić, możliwość wielu kont w aplikacji, pełna usunięcie danych.

Grupy, kanały i instancje samodzielne

Wbudowane grupy/kanały przez serwer ONYX — bez szyfrowania E2EE dla synchronizacji.

Zewnętrzne instancje samodzielne:

  • Lokalna sieć: wymiana plików i czaty bez internetu.
  • Prywatne społeczności na VPS na zaproszenie.
  • Publiczny kanał z subskrypcją na zaproszenie.

Połączenie: wpisanie adresu na ekranie external_server_join_screen. Wdrożenie: ONYX Server.

Grupy: dwukierunkowe. Kanały: tylko admini.

Lokalne przechowywanie «Ulubione»

Karta do notatek/kategorii (hasła, media, linki). Przechowywane wyłącznie lokalnie, bez synchronizacji ani dostępu do serwera.

Co ważne:

  • Tryb LAN bez internetu: broadcast UDP + fragmentacja mediów.
  • Stos E2EE: X25519, XChaCha20-Poly1305, klucze sesyjne.
  • Wielo urządzeniowość: szyfrowanie per-device, autoryzacja.
  • Flutter: optymalizowany interfejs 60 FPS na wszystkich platformach.
  • Samodzielne wdrożenie: zewnętrzne instancje dla grup i kanałów.

Projekt w wersji beta, idealny do prywatnej komunikacji i lokalnych sieci.

— Editorial Team

Advertisement 728x90

Czytaj dalej