Tor & onion routing
Szczegółowe omówienie jak Phantom używa sieci Tor do routowania ruchu — dlaczego to robimy, jak działa onion routing i co widzi (a czego nie widzi) każdy węzeł na trasie.
Dlaczego Tor
Tradycyjne komunikatory (WhatsApp, Telegram, Signal) łączą się z centralnym serwerem. Nawet jeśli treść wiadomości jest szyfrowana — serwer widzi kto pisze do kogo, kiedy i jak często. To są metadane i są często cenniejsze niż sama treść rozmowy.
Phantom eliminuje ten problem. Zamiast serwera pośredniczącego, wiadomości wędrują bezpośrednio między urządzeniami — przez sieć Tor. Sieć Tor ukrywa adres IP nadawcy i odbiorcy, co oznacza że żaden węzeł pośredni nie wie jednocześnie kto wysyła i kto odbiera.
Czym jest onion routing
Onion routing (routing cebulowy) to technika anonimizacji ruchu sieciowego. Nazwa pochodzi od warstw szyfrowania — każdy węzeł na trasie "zdejmuje" jedną warstwę, jak łuskę cebuli, ale widzi tylko tyle informacji, ile potrzebuje do przekazania pakietu dalej.
Zanim wiadomość opuści Twoje urządzenie, Phantom szyfruje ją trzykrotnie — kluczem każdego z trzech węzłów na trasie. Każdy węzeł odszyfrowuje jedną warstwę i przekazuje pakiet do następnego. Żaden z nich nie zna pełnej trasy.
Twoje urządzenie szyfruje wiadomość trzema warstwami:
┌─────────────────────────────────────────┐
│ Warstwa 3 (klucz węzła wejściowego) │
│ ┌──────────────────────────────────┐ │
│ │ Warstwa 2 (klucz węzła środk.) │ │
│ │ ┌───────────────────────────┐ │ │
│ │ │ Warstwa 1 (klucz węzła │ │ │
│ │ │ wyjściowego) │ │ │
│ │ │ ┌────────────────────┐ │ │ │
│ │ │ │ zaszyfrowana │ │ │ │
│ │ │ │ wiadomość (Signal) │ │ │ │
│ │ │ └────────────────────┘ │ │ │
│ │ └───────────────────────────┘ │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────┘
Trasa wiadomości w Phantom
Każda wiadomość wysłana przez Phantoma przechodzi przez dokładnie trzy węzły Tor (tzw. obwód / circuit), zanim dotrze do odbiorcy. Oto pełna trasa:
Telefon A Sieć Tor Telefon B
───────── ──────── ─────────
[piszesz wiadomość]
[Signal Protocol szyfruje]
[Tor opakowuje 3 warstwy]
│
▼
Tor SOCKS5
127.0.0.1:9050
│
▼
┌─────────────┐
│ Węzeł 1 │ Entry Guard — zna Twój IP
│ (wejście) │ nie zna odbiorcy ani treści
└──────┬──────┘
│
▼
┌─────────────┐
│ Węzeł 2 │ Middle Relay — nie zna nikogo
│ (środkowy) │ przekazuje pakiet dalej
└──────┬──────┘
│
▼
┌─────────────┐
│ Węzeł 3 │ Rendezvous Point — zna adres .onion
│ (spotkanie)│ nie zna Twojego IP
└──────┬──────┘
│
▼
[Hidden Service .onion] ← Telefon B nasłuchuje
[Signal Protocol odszyfrowuje]
[odbiorca czyta wiadomość]
Co widzi każdy węzeł
To kluczowa kwestia. Żaden pojedynczy węzeł nie widzi jednocześnie nadawcy i odbiorcy. Oto co wie każdy z nich:
Węzeł 1 — Entry Guard (strażnik wejścia)
Wie: Twój adres IP (bo łączysz się z nim bezpośrednio).
Nie wie: do kogo piszesz, co piszesz, ani jaki jest adres .onion odbiorcy. Widzi tylko zaszyfrowany pakiet i adres węzła 2.
Węzeł 2 — Middle Relay (przekaźnik środkowy)
Wie: skąd przyszedł pakiet (węzeł 1) i dokąd go wysłać (węzeł 3).
Nie wie: ani Twojego IP, ani adresu .onion odbiorcy, ani treści. Jest to najlepiej chroniony węzeł na trasie — nie zna nikogo.
Węzeł 3 — Rendezvous Point (punkt spotkania)
Wie: adres .onion odbiorcy (bo to on dostarcza pakiet do Hidden Service).
Nie wie: Twojego IP — widzi tylko że pakiet przyszedł od węzła 2.
Hidden Service — każde urządzenie to serwer
W tradycyjnych komunikatorach Twój telefon jest klientem, a centralny serwer — serwerem. W Phantomie każde urządzenie jest jednocześnie klientem i serwerem.
Przy pierwszym uruchomieniu Phantom generuje parę kluczy ED25519. Z klucza publicznego deterministycznie powstaje adres .onion — to Twój "numer telefonu" w sieci Phantom. Na przykład:
x7wqibd4zmbxojl5ayfkm3r7n2e6c4hp.onion
Twoje urządzenie rejestruje ten adres w sieci Tor i zaczyna nasłuchiwać na przychodzące połączenia. Gdy ktoś chce do Ciebie napisać, łączy się z Twoim adresem .onion przez Tor — bez znajomości Twojego IP.
Jak to działa na Androidzie
Phantom uruchamia Tora wewnątrz aplikacji używając biblioteki tor-android (Guardian Project). Tor startuje w tle i wystawia lokalny proxy SOCKS5 na porcie 9050. Cały ruch aplikacji jest kierowany przez ten proxy.
// Uproszczony schemat uruchamiania Tor na Androidzie
1. Phantom startuje → uruchamia tor-android w tle
2. Tor tworzy katalog Hidden Service:
/data/hidden_service/hostname → Twój adres .onion
/data/hidden_service/hs_ed25519_secret_key → klucz prywatny
3. Tor wystawia SOCKS5 na 127.0.0.1:9050
4. Phantom nasłuchuje na 127.0.0.1:8080
5. Tor mapuje: adres.onion:8080 → 127.0.0.1:8080
Łączenie z innym urządzeniem
Gdy chcesz wysłać wiadomość, Phantom łączy się z adresem .onion odbiorcy przez proxy SOCKS5. Połączenie przechodzi przez 3 węzły Tor, a odbiorca widzi je jako przychodzące na swój lokalny port 8080.
// Połączenie z odbiorcą przez Tor
Twój telefon
→ SOCKS5 proxy (127.0.0.1:9050)
→ Tor (3 węzły)
→ x7wqibd4zmbxojl5ayfkm3r7n2e6c4hp.onion:8080
→ telefon odbiorcy (127.0.0.1:8080)
Obwód Tor (circuit)
Obwód (circuit) to konkretna trasa przez 3 węzły, wybrana dla danego połączenia. Phantom pozwala zobaczyć aktualny obwód w interfejsie aplikacji — modal TOR pokazuje kraje i latencję każdego węzła.
Rotacja obwodu
Obwody nie są stałe. Tor automatycznie rotuje je co około 10 minut. Phantom dodatkowo pozwala ręcznie wymusić nowy obwód (przycisk "Nowy obwód" w modalu TOR). Nowy obwód oznacza nową trasę — inne węzły, inne kraje, inny "odcisk" ruchu.
Rotacja obwodu pomaga przeciwdziałać analizie ruchu (traffic analysis). Jeśli ktoś monitoruje węzeł 1, po rotacji ruch znika — bo teraz płynie przez inny węzeł wejściowy.
Obwód A (aktualny):
Guard: DE (Frankfurt, 23ms) → Middle: CH (Zurych, 41ms) → RP: IS (Reykjavik, 89ms)
[kliknięcie "Nowy obwód"]
Obwód B (nowy):
Guard: NL (Amsterdam, 18ms) → Middle: RO (Bukareszt, 55ms) → RP: CA (Montreal, 112ms)
Hidden Service v3 — szczegóły techniczne
Phantom używa Hidden Service w wersji 3 (v3), która jest obecnym standardem sieci Tor. Główne cechy:
Klucze i adres
Adres .onion v3 ma 56 znaków (v2 miał 16). Jest generowany z klucza publicznego ED25519 plus suma kontrolna i numer wersji. To oznacza że:
adres.onion = base32( klucz_publiczny_ed25519 [32B]
+ checksum [2B]
+ version [1B] )
Razem: 35 bajtów → 56 znaków base32
Klucz ED25519 daje 128-bitowe bezpieczeństwo (odporność na ataki brute-force). Złamanie adresu .onion v3 metodą siłową jest obliczeniowo niemożliwe przy obecnej technologii.
Protokół spotkania (Rendezvous Protocol)
Gdy ktoś chce się połączyć z Twoim Hidden Service, nie łączy się bezpośrednio z Twoim węzłem. Zamiast tego:
1. Odbiorca (Hidden Service) publikuje deskryptor w DHT sieci Tor
→ deskryptor zawiera "introduction points" (węzły kontaktowe)
2. Nadawca pobiera deskryptor z DHT
→ wie teraz przez jakie węzły może się skontaktować
3. Nadawca wybiera Rendezvous Point (węzeł spotkania)
→ łączy się z nim i czeka
4. Nadawca wysyła do Introduction Point:
"powiedz odbiorcy żeby przyszedł do Rendezvous Point X"
5. Introduction Point przekazuje tę prośbę do odbiorcy
6. Odbiorca łączy się z Rendezvous Point
→ nadawca i odbiorca "spotykają się" w tym węźle
→ zaczynają komunikację
Cały ten proces jest automatyczny i trwa 1–3 sekundy. Użytkownik widzi jedynie wskaźnik połączenia w interfejsie.
Dwie warstwy ochrony
Phantom łączy dwie niezależne warstwy bezpieczeństwa. Każda chroni inny aspekt komunikacji:
┌──────────────────────────────────────────────────────┐
│ Warstwa 1: Signal Protocol │
│ ───────────────────────────── │
│ Chroni: TREŚĆ wiadomości │
│ Jak: szyfrowanie end-to-end (AES-256-GCM) │
│ Efekt: nawet jeśli ktoś przechwyci pakiet, │
│ nie odczyta wiadomości │
├──────────────────────────────────────────────────────┤
│ Warstwa 2: Tor Hidden Service │
│ ───────────────────────────── │
│ Chroni: METADANE (kto z kim rozmawia) │
│ Jak: onion routing przez 3 węzły │
│ Efekt: nawet jeśli ktoś monitoruje sieć, │
│ nie wie kto z kim rozmawia │
├──────────────────────────────────────────────────────┤
│ Razem │
│ ───── │
│ Nikt nie wie ANI co piszesz, ANI do kogo │
└──────────────────────────────────────────────────────┘
To podejście nazywamy "defense in depth" — nawet jeśli jedna warstwa zawiedzie (np. zostanie złamany Signal Protocol), druga nadal chroni Twoje metadane. I odwrotnie.
Brak exit node'a — dlaczego to ważne
W klasycznym użyciu Tor (np. Tor Browser) ruch wychodzi z sieci Tor przez tzw. exit node i trafia do zwykłego internetu. Exit node widzi nieszyfrowany ruch (chyba że strona używa HTTPS) — to znany punkt ryzyka.
Phantom nie używa exit node'ów. Komunikacja odbywa się w całości wewnątrz sieci Tor: Hidden Service → Hidden Service. Ruch nigdy nie opuszcza sieci Tor.
Tor Browser (klasyczny):
Twój PC → Guard → Middle → Exit Node → internet → serwer
↑
widzi ruch (ryzyko!)
Phantom (Hidden Service ↔ Hidden Service):
Telefon A → Guard → Middle → Rendezvous ← Middle ← Guard ← Telefon B
↑
nie widzi treści
nie ma exit node'a
To eliminuje cały wektor ataku związany z exit node'ami — podsłuch, podmiana treści, analiza ruchu wychodzącego.
Czego Tor nie chroni
Tor jest potężnym narzędziem anonimizacji, ale nie jest magiczny. Ważne jest rozumienie granic ochrony:
Timing attacks (ataki czasowe)
Jeśli adversary kontroluje zarówno węzeł wejściowy jak i punkt spotkania (Rendezvous Point), może skorelować czas wysyłania i odbierania pakietów. To pozwala z pewnym prawdopodobieństwem ustalić kto z kim rozmawia — nawet bez odczytywania treści. Rotacja obwodów częściowo mityguje ten atak.
Analiza wzorców ruchu
Nawet zaszyfrowany ruch ma kształt — rozmiar pakietów, częstotliwość, pora dnia. Globalny obserwator (np. agencja rządowa monitorująca duże fragmenty internetu) teoretycznie może korelować wzorce ruchu wchodzącego i wychodzącego z sieci Tor.
Bezpieczeństwo urządzenia
Tor chroni komunikację w tranzycie. Nie chroni urządzenia. Jeśli Twój telefon jest skompromitowany (malware, stalkerware, fizyczny dostęp) — atakujący czyta wiadomości bezpośrednio na ekranie, zanim trafią do Tora.
Latencja i wydajność
Routing przez 3 węzły Tor dodaje latencję. Typowe opóźnienie w sieci Tor to 200–800ms w jedną stronę, w zależności od lokalizacji węzłów i obciążenia sieci.
W praktyce oznacza to:
Wysłanie wiadomości tekstowej: 0.3 – 1s
Nawiązanie nowego połączenia: 1 – 3s (Rendezvous Protocol)
Wysłanie zdjęcia (100 KB): 2 – 5s
Rotacja obwodu: 1 – 2s
To wolniej niż Signal czy WhatsApp (które mają <100ms dzięki centralnym serwerom), ale cena za pełną anonimizację metadanych. Phantom priorytetyzuje bezpieczeństwo ponad szybkość — i jest transparentny co do tego kompromisu.
Phantom vs inne komunikatory — warstwa sieciowa
Serwer Ochrona IP Ochrona metadanych
────── ────────── ──────────────────
WhatsApp centralny brak brak
Telegram centralny brak brak
Signal centralny częściowa* częściowa*
Briar brak (P2P+Tor) Tor Tor
Session zdecentraliz. onion routing częściowa
Phantom brak (P2P+Tor) Tor HS↔HS Tor HS↔HS
* Signal używa "Sealed Sender" do ukrycia nadawcy od serwera,
ale serwer nadal zna odbiorcę i czas dostarczenia.