Przejdź do dokumentacji
Baza wiedzy

Szyfrowanie end-to-end

Klucze OpenPGP tworzone w Twojej przeglądarce. Poczta, którą wysyłasz na inny adres OpenEmail, może zostać zapieczętowana, zanim opuści kartę, a zapieczętowana poczta zaadresowana do Ciebie otwiera się w panelu czytania, odszyfrowana na Twoim urządzeniu. Klucze nigdy nie są nasze, więc nie mamy czego wydać.

Szczegóły

  • Obie połowy są podpięte od początku do końca. Pisanie do odbiorcy, którego klucz jest opublikowany, pieczętuje treść w przeglądarce, zanim żądanie ją opuści; serwer dostaje pancerz, którego nie umie odczytać, oznacza go jako pgp-mime i buduje prawdziwą wiadomość multipart/encrypted. Czytanie przebiega tak samo w odwrotną stronę: szyfrogram jest pobierany, odszyfrowywany w karcie i renderowany jak zwykła poczta.
  • Algorytm jest ten sam, którego używają wszyscy inni: OpenPGP, przez openpgp.js, i PGP/MIME na łączu. Klucz v4 na Curve25519, ten sam kształt, jaki wydaje Proton i produkuje gpg swoim domyślnym nowoczesnym algorytmem. Poczta, którą to czyta, jest więc w zasadzie tą samą pocztą, jaką produkują Thunderbird, gpg i Proton, i nic tutaj nie jest naszym własnym formatem, który trzeba by później odkręcać.
  • W praktyce jest to jednak OpenEmail do OpenEmail. W tym kodzie nie ma nigdzie Web Key Directory, odpytywania serwerów kluczy ani parsowania nagłówka Autocrypt: jedynym miejscem, gdzie w ogóle odnajduje się klucz odbiorcy, jest nasz własny katalog, który trzyma klucze opublikowane z tej aplikacji przez osoby, których adres jest na hostowanej tu domenie. Nie ma też sposobu na wydanie swojego klucza. Aplikacja publikuje Twoją połowę publiczną do tego katalogu i nie oferuje jej kopiowania ani eksportu, więc korespondent na Thunderbirdzie nie ma wspieranego sposobu, by ją zdobyć. Współpraca z szerszym światem PGP jest własnością formatu, a nie czymś, co produkt na razie dla Ciebie robi.
  • Czytanie nie jest tak ograniczone, bo odszyfrowanie nie potrzebuje katalogu. Każda wiadomość PGP/MIME lub z pancerzem PGP w treści, która dotrze do tej skrzynki zapieczętowana kluczem obecnym w tej przeglądarce, otworzy się, kto by jej nie wysłał i jakiego klienta by nie użył. Dotyczy to także wiadomości zapieczętowanych kluczem, z którego już przeszedłeś na inny: wycofane klucze zostają w pęku i są próbowane obok bieżącego, więc rotacja nie kosztuje Cię poczty, którą już odebrałeś.
  • Zielony oznacza otwarte i nie da się tego osiągnąć inaczej. Wiersz Szczegóły → Bezpieczeństwo zmienia się na zielony dopiero wtedy, gdy odszyfrowanie faktycznie zwróciło otwarty tekst w tej karcie, nigdy na podstawie pola w wiadomości ani samego faktu, że przyszła zaszyfrowana koperta. Brzmi wtedy „Zaszyfrowane end-to-end. Otwarte Twoim kluczem w tej przeglądarce”. Wszystko poniżej ma własne zdanie, a nie wspólne: jeszcze szukamy, klucz zablokowany, zapieczętowane kluczem, którego ta przeglądarka nie ma, nie udało się otworzyć, brak jakiegokolwiek klucza tutaj oraz ta przeglądarka nie pozwoliła nam sprawdzić. „Nie mogliśmy sprawdzić” i „nie masz klucza” to różne stwierdzenia, a wiersz zmusza Cię do przeczytania, które dostałeś.
  • S/MIME wciąż nie da się otworzyć. To CMS pod certyfikatem X.509, openpgp.js go nie ruszy, a w produkcie nie ma magazynu certyfikatów, który trzymałby klucz, gdyby nawet ruszył, więc wiadomość S/MIME mówi, że OpenEmail nie potrafi jej otworzyć, i nie dostaje propozycji odblokowania, która nic by nie dała.
  • Połowa prywatna jest generowana w Twojej przeglądarce i nigdy jej nie opuszcza: ani zaszyfrowana, ani w kopii zapasowej, ani w narzędziu wsparcia. Serwer nigdy jej nie dostaje, więc nie ma tu czego wydać, zająć na mocy wezwania sądowego ani wyciec. Jest przechowywana zablokowana hasłem we własnej bazie IndexedDB, openemail-keyring, celowo poza zasięgiem porady „wyczyść pamięć podręczną” i resetu z konsoli debugowania: oba czyszczą pamięć podręczną zapytań, a klucz trzymany obok niej sprawiłby, że rutynowa porada wsparcia trwale niszczy każdą zaszyfrowaną wiadomość, jaką konto kiedykolwiek odebrało. Usunięcie konta rzeczywiście go usuwa, bo tam poczta idzie razem z nim. Odblokowanie trzyma go w pamięci przez 15 minut bezczynności i najwyżej 8 godzin, po czym odczytanie kolejnej zapieczętowanej wiadomości znów prosi o hasło.
  • Nie ma depozytu klucza ani odzyskiwania i jest to trwałe, a nie niezbudowane. Twoje hasło to jedyne wejście; zapomnij je, a każda wiadomość, którą ktokolwiek Ci zapieczętował, zostanie na naszych serwerach jako szyfrogram, którego nikt nie odczyta, my również. Poczta przepada i żadne proszenie jej nie odzyska. Ekran zakładania klucza mówi to, zanim powstanie pierwszy klucz, za polem wyboru, które musisz zaznaczyć, plik kopii zapasowej jest obowiązkowy, a przycisk Gotowe pozostaje nieaktywny, dopóki go nie pobierzesz. Ten plik jest zapisywany bez dodatkowego utwardzenia w spoczynku, którego używa ta przeglądarka, celowo, żeby nadal importował się do starszych wydań gpg: kopia zapasowa, której nie otworzysz gdzie indziej, nie jest kopią zapasową. Klucz żyje też w jednej przeglądarce na jednym urządzeniu, a telefon czy drugi laptop nie mają niczego, dopóki nie zaimportujesz tam tego pliku.
  • Katalog trzyma klucze publiczne i nic poza nimi, a klucz należy do osoby, a nie do skrzynki, bo klucz przypięty do adresu musiałby być kopiowany między wszystkimi, którym ten adres jest udostępniony, co jest depozytem klucza pod inną nazwą. Odpytanie go wymaga zalogowanej sesji i uprawnienia do wysyłki, nigdy publicznego punktu końcowego, bo otwarte sondowanie adresów jest wyrocznią mówiącą każdemu, które adresy są tu żywymi skrzynkami. Odpowiada identycznie na „nie hostujemy tego” i „hostujemy, a nikt nie opublikował klucza”, bo rozróżnienie ich tylko przesuwa wyrocznię za logowanie, zamiast ją usunąć. A klucz przestaje być wydawany w chwili, gdy jego właściciel traci dostęp do adresu, a nie wtedy, gdy ktoś sobie przypomni, żeby go unieważnić.
  • Każdy bajt jest pieczętowany w przeglądarce w chwili, gdy go piszesz, i to właśnie sprawia, że opóźnione wysyłki w ogóle działają: zaplanowana wiadomość albo taka, która siedzi w oknie cofnięcia, jest przechowywana jako szyfrogram i wysyłana później przez kolejkę, która nie trzyma żadnego klucza i nic z tego nie odczyta. Odbiorca, którego odpytanie katalogu NIE POWIODŁO SIĘ, blokuje wysyłkę, zamiast zostać po cichu potraktowanym jako ktoś bez klucza. A zapieczętowana wiadomość wychodzi wyłącznie ścieżką, która niesie wiadomość w całości. Ścieżka wychodząca przyjmująca zamiast tego treść HTML wysłałaby pancerz jako widoczny tekst i zgłosiła sukces, więc wysyłka, która by tam trafiła, jest odrzucana, zanim wyjdzie choć bajt, a nie po fakcie.
  • Ile będzie kosztować pieczętowanie, zmierzone, a nie zgadnięte: pancerz to około 1,86 raza surowych bajtów, więc mniej więcej 2,7 MB załączników mieści się w 5 MB, na które pozwala ścieżka wysyłki, a kompozytor odrzuca ładunek większy od tego, zanim spędzi sekundy na szyfrowaniu czegoś, co transport i tak odrzuci. Szyfrowana poczta nie raportuje żadnych otwarć ani kliknięć, bo śledzenie per odbiorca działa przez różnicowanie treści dla każdej osoby, a jeden zapieczętowany blok nie może się różnić, a przepisany link jest linkiem, który możemy odczytać, czyli przeciwieństwem tej deklaracji. Szyfrowanej wysyłki nigdy też nie da się zdeduplikować kluczem idempotencji: świeży klucz sesji sprawia, że szyfrogram to inne bajty przy każdej próbie, więc ponowienie nigdy nie ma tego samego odcisku co oryginał.
  • Planowanie pieczętuje w chwili pisania, a nie w chwili wysyłki. Kompozytor buduje szyfrogram pod klucze, które odbiorcy mają w dniu pisania, a nie w dniu, w którym wiadomość miałaby wyjść, zgodnie z regułą, którą ten produkt stosuje już do szablonów i tłumaczeń, gdzie zaplanowana wiadomość niesie to, co zatwierdziłeś, a nie to, co zmieniło się później. Różnica polega na tym, że nieaktualny szablon jest jedynie przestarzały, a nieaktualny klucz jest nieczytelny, więc kompozytor nazywa datę słowami, zamiast oferować zastrzeżenie: „Zapieczętowane teraz, wysyłka …. Każdy na liście będzie potrzebował klucza, który ma dzisiaj.” Odmowa pilnująca drugiej połowy jest wdrożona, ale nigdy nie zadziałała, bo taka wiadomość jeszcze nie może istnieć: gdyby istniała, późniejsza edycja zostałaby odrzucona, a nie po cichu dopuszczona, bo załatanie treści zapisałoby otwarty tekst na szyfrogramie, a zmiana odbiorców zmieniłaby to, komu jest zapieczętowana, i jedno i drugie dostarcza wiadomość otwartym tekstem, podczas gdy każdy ekran wciąż nazywa ją zaszyfrowaną.
  • Dwóch rzeczy kompozytor w ogóle nie zaoferuje i mówi o tym wprost, zamiast zawodzić na łączu. Szablon jest renderowany na serwerze z opublikowanej wersji, więc w tej przeglądarce nie ma czego pieczętować. Odpowiedź cytuje pod sobą rozmowę, a ten cytat jest doklejany po tym, jak treść zostałaby zapieczętowana, zostawiając czytelną kopię całego wątku poza pieczęcią, więc odpowiedzi i przekazania nie mogą być szyfrowane, dopóki cytowana historia nie zostanie schowana wewnątrz szyfrogramu.
  • Nic z tego nie ukrywa Twojego tematu, tego, do kogo napisałeś, ani kiedy. Temat podróżuje otwartym tekstem na zapieczętowanej wiadomości dokładnie tak jak na każdej innej, a panel czytania mówi to na samej wiadomości: „Temat i adresy podróżowały otwartym tekstem; ten tekst nie.” PGP obejmuje treść i żadna jego implementacja nie obejmuje reszty. Wersje robocze też są niezapieczętowane, bo autozapis wciąż zapisuje otwarty tekst do Twojej skrzynki, gdy piszesz, a ciche niezapisywanie oznaczałoby utratę pracy, więc kłódka ujawnia to słowami.
  • Rozpoznawanie poczty, która przychodzi zapieczętowana, powstało pierwsze i nadal obowiązuje. PGP/MIME, pancerz PGP w treści i S/MIME renderowały się kiedyś jako pusta treść z dwoma bezsensownymi załącznikami, bo parser traktuje jako czytelne tylko zwykły tekst i HTML, a resztę wrzucał na pasek plików. Te części są teraz rozpoznawane, elementy techniczne protokołu nie trafiają na listę załączników, szyfrogram jest przechowywany w całości i to z niego odszyfrowuje czytnik, zamiast pobierać cokolwiek nowego, a wiadomość, której nikt tutaj nie potrafi otworzyć, nadal mówi to wprost.
  • Wiadomość podpisana jest traktowana jako osobna rzecz, bo nią jest. Jej treść jest czytelna, więc wyszukiwanie, reguły i cała reszta nadal na niej działają; nigdy nie jest zamykana za kłódką i nigdy nie przechodzi przez odszyfrowywanie. Wiersz raportuje „Podpisane przez nadawcę. Podpis niesprawdzony”, przygaszony, i pozostaje przygaszony, dopóki cokolwiek tutaj nie będzie potrafiło naprawdę zweryfikować podpisu, czego nic jeszcze nie robi, również na wiadomości, którą udało się odszyfrować. Zobaczenie, że wiadomość jest zapieczętowana, to nie to samo co jej otwarcie, a otwarcie to nie to samo co wiedza, kto ją zapieczętował.
  • Na wiadomości zaszyfrowanej treść jest odcięta od wszystkiego, co inaczej by ją czytało: fragmentu wyszukiwania, przebiegu phishingowego po treści, kontroli pisania przez AI, warunków regułowych na treści, importu zaproszeń kalendarza i streszczeń wątków. Uwierzytelniająca połowa kontroli phishingu nadal działa, bo DMARC, DKIM i SPF czyta się z nagłówków, których szyfrogram nie ukrywa. Odszyfrowanie nic z tego nie zmienia. Otwarty tekst istnieje wyłącznie w karcie, która go otworzyła, więc zapieczętowana wiadomość pozostaje niewyszukiwalna i poza funkcjami AI także po tym, jak ją przeczytasz, a tłumaczenie nie jest na niej oferowane. To koszt tej deklaracji, a nie przeoczenie.