Szyfrowany czat

Wybierz, jak przechowywane są wiadomości, a potem udostępnij link.

Krok 1 z 3

Przechowywanie wiadomości

Jak to działa

Jak zacząć

Wybierz, jak przechowywane są wiadomości, wybierz nazwę pokoju, ustaw trudne do odgadnięcia hasło o długości co najmniej 16 znaków i udostępnij link osobom, z którymi chcesz rozmawiać. Pokoje tworzy się tylko tutaj, więc każdy dostaje silne hasło i świadomie wybrany tryb wiadomości; otwarcie adresu nieistniejącego pokoju prowadzi z powrotem do tego formularza. Link nie zawiera klucza: każdy musi wpisać hasło, które należy przekazać inną drogą, na przykład osobiście lub w innej aplikacji. Zapisany pokój nie ma hasła: dostaje losowy adres i losowy 256-bitowy klucz po # w linku, więc to link jest kluczem i trzeba go udostępniać równie ostrożnie.

Wiadomości

Każda wiadomość jest szyfrowana w Twojej przeglądarce algorytmem AES-256-GCM. Przy wejściu do pokoju hasło przechodzi jednokrotnie przez Argon2id z 64 MiB pamięci i 3 przebiegami, więc każda próba odgadnięcia offline jest powolna i pamięciożerna. HKDF-SHA256 wyprowadza następnie z wyniku klucz wiadomości, który zależy też od trybu wiadomości w pokoju, oraz drugą, oddzielną wartość, która jedynie dowodzi serwerowi, że należysz do pokoju. Serwer poznaje tę wartość, ale nigdy klucza szyfrowania, a pokój na serwerze nosi nazwę pochodzącą ze skrótu tej wartości, a nie Twoją nazwę pokoju. Zapisany pokój pomija powolne hashowanie hasła: jego klucz jest już losowy, więc HKDF-SHA256 wyprowadza z niego bezpośrednio klucz wiadomości i wartość dostępu. W pokojach bez historii na serwerze każda wiadomość dostaje dodatkowo drugą warstwę z utajnianiem z wyprzedzeniem (forward secrecy), opisaną niżej.

Co serwer widzi i przechowuje

Pokoje działają na Cloudflare Workers. Przekaźnik przesyła zaszyfrowane wiadomości osobom w pokoju i ich nie przechowuje, z wyjątkiem zapisanych pokoi, gdzie trzyma zaszyfrowane wiadomości, najwyżej 1000 na pokój, w Unii Europejskiej, dopóki któryś z członków nie usunie pokoju albo nikt go nie odwiedzi przez 90 dni. Poza tym zachowuje jedynie ustawienia pokoju i usuwa je, gdy pokój jest pusty przez 7 dni. Widzi natomiast, kiedy wiadomości są wysyłane, ile osób jest połączonych i, po rytmie, prawdopodobnie także to, kiedy ktoś pisze. Każda wiadomość jest dopełniana do jednego z ograniczonego zestawu rozmiarów, co najmniej 512 bajtów, więc krótkie wiadomości, wskaźniki pisania i sygnały obecności wyglądają tak samo, a dłuższe zdradzają tylko przybliżony rozmiar. Cloudflare, jak każdy dostawca hostingu, widzi Twój adres IP, a nazwa pokoju pojawia się w adresie wczytywanej strony. W zapisanych pokojach przechowuje też publiczne klucze ML-DSA członków, zaszyfrowane kluczem pokoju, więc nie rozpozna po kluczu członka, który wraca.

Historia i znikające wiadomości

W trybie domyślnym każdy uczestnik przechowuje historię we własnej przeglądarce: podpisane wiadomości zapieczętowane kluczem wyprowadzonym z sekretu pokoju, więc przetrwają przeładowanie strony. Osoby online przekazują nowo przybyłemu do 200 ostatnich wiadomości, zaszyfrowanych tylko dla niego i nadal z podpisem każdego autora, więc przy przekazywaniu historii nikt nie może wkładać innym słów w usta. Utajnianie z wyprzedzeniem chroni to, co przechodzi przez przekaźnik; to, co zachowały przeglądarki członków, mogą one pokazać każdemu, kto dołączy z hasłem, i właśnie do tego służy ten tryb. W zapisanym pokoju zaszyfrowana historia żyje zamiast tego na serwerze, więc jest dostępna po przeładowaniu strony, na nowym urządzeniu i dla osób dołączających później; Twoja przeglądarka też trzyma kopię i prosi serwer tylko o to, czego jej brakuje. Możesz zamiast tego ustawić, by wszystkie wiadomości znikały od 5 sekund do 1 dnia po wyświetleniu; wtedy nic nie jest zapisywane. W każdym pokoju możesz zakończyć pojedynczą wiadomość na !N, na przykład !30, a zniknie po N sekundach i nie trafi do zapisanej historii. Odliczanie działa w przeglądarce każdego uczestnika, więc zmodyfikowany klient albo zwykły zrzut ekranu i tak może zachować kopię.

Połączenia

Połączenia głosowe i wideo korzystają z WebRTC. Oprócz standardowego szyfrowania DTLS-SRTP twoja przeglądarka przed wysłaniem szyfruje każdą ramkę dźwięku i obrazu, łącznie z udostępnianiem ekranu, algorytmem AES-256-GCM na wzór SFrame. Każdy uczestnik przy dołączaniu tworzy losowy klucz mediów i przekazuje go każdemu z pozostałych osobno: wewnątrz szyfrowanego kanału pokoju, dodatkowo zapieczętowany kluczem, który na czas tego połączenia współdzielą tylko te dwie przeglądarki (ECDH P-256). Gdy ktoś wychodzi, wszyscy pozostali przechodzą na nowy klucz, więc osoba, która wyszła, nie odszyfruje tego, co nastąpi później. Ramki, których nie da się odszyfrować, są odrzucane i nigdy nie są odtwarzane, a przeglądarka, która nie potrafi szyfrować ramek, nie może dołączyć do połączenia. Zestawianie połączenia odbywa się przez pokój w postaci zaszyfrowanych wiadomości. Media zawsze przechodzą przez przekaźnik TURN, więc uczestnicy nigdy nie widzą swoich adresów IP; przekaźnik przesyła tylko zaszyfrowane pakiety. Każdy uczestnik łączy się z każdym innym, więc połączenia najlepiej sprawdzają się w małych grupach.

Pliki

Pliki do 90 MB są szyfrowane w Twojej przeglądarce własnym losowym kluczem, łącznie z nazwą pliku. Klucz i link do pobrania są przesyłane tylko w zaszyfrowanej wiadomości, więc plik jest chroniony dokładnie tak jak wiadomość, która go niesie, łącznie z utajnianiem z wyprzedzeniem. Zaszyfrowany plik trafia do własnego magazynu encrypt.click, a jeśli to się nie uda, do zapasowych serwisów hostingowych przez serwer encrypt.click (tylko pliki do 50 MB). Serwisy te widzą tylko zaszyfrowany plik, jego rozmiar i adres, z którego go wysłano. Przesłane pliki są usuwane 24 godziny po przesłaniu; wiadomość zostaje w historii, pobranie już nie.

Warto wiedzieć

Czat jest tak prywatny, jak link lub hasło: każdy, kto je ma, może dołączyć i od tej chwili czytać rozmowę. W pokojach z utajnianiem z wyprzedzeniem hasło zdobyte później nie otworzy jednak wcześniej nagranego ruchu, choć w trybie domyślnym członkowie online przekazują niedawną historię każdemu, kto dołączy. Błędne hasło prowadzi do pokoju, który nie istnieje, więc jeśli strona informuje, że pokój nie istnieje, choć spodziewałeś się tam innych, sprawdź hasło. Do pokoju może dołączyć do 32 osób.

Klucze członków w zapisanych pokojach

W każdym pokoju przeglądarka tworzy klucz podpisu dla tego pokoju i zachowuje go dla siebie; każda wiadomość niesie część publiczną i podpis, a wszystko niepodpisane jest odrzucane, także historia przekazywana przez innych członków. Nazwy to tylko etykiety: losowy alias albo to, co wpisał członek. Pozostali członkowie pamiętają, z jakim kluczem dana nazwa pojawiła się po raz pierwszy, i ostrzegają, gdy ta sama nazwa albo nazwa łudząco podobna pojawi się z nowym kluczem, bo tak właśnie wyglądałby oszust znający hasło lub link. Panel członków pokazuje przy każdym kod klucza, krótki odcisk tego jednego klucza, oraz numer bezpieczeństwa wyliczony z obu waszych kluczy, który jest taki sam na obu ekranach: porównajcie go osobiście lub głosowo. W zapisanym pokoju kluczem członka jest para jego kluczy Ed25519 i ML-DSA-44, a kod klucza i numer bezpieczeństwa obejmują oba. Nowa przeglądarka lub urządzenie dostaje nowy klucz, więc po zmianie spodziewaj się tego ostrzeżenia. Podpis dowodzi, kto w pokoju napisał wiadomość, a nie kim jest, a do środka nadal wpuszcza tylko hasło lub link. Tryb wiadomości jest częścią klucza pokoju, więc serwer nie może po cichu zmienić pokoju ze znikającymi wiadomościami w taki, który przechowuje historię. W zapisanym pokoju każdy, kto widział link, może czytać wszystko, dopóki pokój istnieje, więc udostępniaj go ostrożnie i usuń pokój, gdy spełni swoje zadanie; usunięcie kasuje historię z serwera i z przeglądarek wszystkich połączonych.

Utajnianie z wyprzedzeniem

W pokojach, które trzymają historię tylko w przeglądarkach, i w pokojach ze znikającymi wiadomościami sam klucz pokoju nie otwiera żadnej wiadomości. Każda przeglądarka przy wejściu tworzy nową parę kluczy P-256 i trzyma ją wyłącznie w pamięci. Każdy członek ma własny łańcuch wysyłania: każda wiadomość jest szyfrowana AES-256-GCM kluczem, który HKDF-SHA256 wyprowadza z łańcucha, potem łańcuch przesuwa się o krok, a użyte klucze są kasowane. Bieżący klucz łańcucha każdy z pozostałych członków dostaje osobno, zapieczętowany kluczem z ich dwóch kluczy tymczasowych (ECDH) połączonych z sekretem wyprowadzonym z hasła pokoju, i jak zawsze wewnątrz podpisanego kanału pokoju. Kto nagra ruch i pozna hasło później, nie przeczyta wiadomości bez złamania wymiany kluczy, a po zakończeniu sesji potrzebnych kluczy nie ma już na żadnym urządzeniu. Przyszły komputer kwantowy, który złamie P-256, nadal potrzebowałby hasła; wobec kogoś, kto ma hasło i taki komputer, utajnianie z wyprzedzeniem nie działa. Łańcuchy są wymieniane po 100 wiadomościach lub 10 minutach i za każdym razem, gdy ktoś wychodzi: nowy łańcuch dostają tylko członkowie, którzy odpowiedzą, więc ten, kto wyszedł, nie może dalej czytać swoimi kluczami. Nowo przybyły dostaje każdy łańcuch dopiero w jego bieżącym kroku, więc nic, co przeszło przez przekaźnik przed jego przyjściem, nie otworzy się jego kluczami. Zapisane pokoje nie mają utajniania z wyprzedzeniem: ich historia musi pozostać czytelna na każdym urządzeniu z linkiem.

Zapisane pokoje: pełna historia i podpisy postkwantowe

Zamiast tego zapisane pokoje pilnują, by historia była kompletna. Każda zapisana wiadomość niesie kolejny numer swojego autora i skrót jego poprzedniej zapisanej wiadomości, oba pod podpisami. Twoja przeglądarka śledzi łańcuch każdego autora w miarę napływu historii i pamięta, dokąd doszła, a członkowie online ogłaszają swój ostatni numer i skrót. Gdy serwer pominie wiadomości, zmieni kolejność wiadomości jednego autora albo zatrzyma najnowsze, lub gdy dwie różne wiadomości twierdzą, że należą do tego samego miejsca, czat pokaże ostrzeżenie. Serwer nadal usuwa najstarsze wiadomości, gdy pokój ma ich 1000, a czat o tym informuje, jeśli stało się to podczas Twojej nieobecności; może też zatrzymać najnowsze wiadomości kogoś, kto nie jest online, a kolejność między różnymi autorami nie jest sprawdzana. Zapisane pokoje dodatkowo podpisują każdą wiadomość obok Ed25519 także algorytmem ML-DSA-44 (FIPS 204), a wiadomość liczy się tylko wtedy, gdy oba podpisy są poprawne, więc jej podrobienie wymagałoby złamania obu. Każda przeglądarka trzyma swój klucz ML-DSA zapieczętowany kluczem wyprowadzonym z linku pokoju. Wiadomości wskazują go skrótem, a serwer przechowuje publiczne klucze członków zaszyfrowane kluczem pokoju, aby dało się sprawdzić także wiadomości osób, które nie są online. Wiadomość bez prawidłowego podpisu ML-DSA, także taka, której klucz ML-DSA jest niedostępny, jest odrzucana.