Od kuchni

Jak działa Buzzdrop

Co się dzieje, gdy wysyłasz plik albo notatkę: co działa gdzie, co przechodzi przez sieć i co nasz serwer widzi, a czego nie, w każdej chwili.

  • Nie możemy odczytać twoich plików ani notatek

    Są szyfrowane, zanim opuszczą twoje urządzenie. Serwer przechowuje tylko szyfrogram i nigdy nie widzi hasła.

  • Jednorazowo znaczy naprawdę jednorazowo

    Serwer trzyma połowę klucza i wydaje ją raz, tylko komuś, kto potwierdzi hasło. Potem ją niszczy.

  • Przechowujemy jednak część metadanych

    Nazwa pliku, znaczniki czasu i adres IP, z którego przesyłkę otwarto. Co przechowujemy i jak długo.

W skrócie

Cały przebieg w sześciu krokach, z twojej strony.

  1. Wybierz plik albo napisz notatkę. Jedno i drugie jest chronione tak samo.

  2. Ustaw hasło. Twoja przeglądarka szyfruje przesyłkę, zanim cokolwiek zostanie wysłane.

  3. Dodaj termin ważności. Opcjonalnie. Gdy minie, przesyłka zostaje usunięta – otwarta czy nie.

  4. Dostajesz jeden link. Wskazuje przesyłkę. Sam niczego nie otwiera.

  5. Wyślij link. Hasło przekaż inną drogą: w innej aplikacji, przez telefon.

  6. Odbiorca potwierdza hasło, raz. Wtedy przesyłka pobiera się raz i zostaje usunięta z serwera. Odszyfrowuje się na urządzeniu odbiorcy.

Przebieg

Aplikacja w przeglądarce czy CLI, plik czy notatka: to ten sam protokół i ta sama kryptografia. Wybierz widok, a kroki się do niego dopasują.

Krok 1 Wysyłanie, etap 1

Serwer widzi: Że zaczyna się wysyłanie

Nigdy nie widzi: Pliku, notatki ani hasła

Kto działa
Twoja przeglądarka, potem serwer.
Co przechodzi przez sieć
Żądanie POST /upload/begin, uwierzytelnione twoją sesją logowania, z tokenem CSRF. Serwer odpowiada nowym file_id i losową, 32-bajtową częścią klucza H.
Co widzi serwer
Że twoje konto zaczyna wysyłanie. Na razie nic o pliku ani notatce.
Dlaczego
Klucz pliku wymaga H, więc H musi istnieć, zanim cokolwiek zostanie zaszyfrowane. Serwer go przechowuje: to ta połowa klucza, którą wyda dokładnie raz. Wysyłanie rozpoczęte i niedokończone zostaje usunięte, gdy ma ponad godzinę – przy następnym wysyłaniu albo restarcie.

Krok 2 Szyfrowanie na miejscu

Serwer widzi: Nic

Nigdy nie widzi: Hasła, Kp ani treści

Kto działa
Sama twoja przeglądarka, w JavaScripcie strony. Nic nie przechodzi przez sieć.
Co się dzieje
Wpisujesz hasło albo każesz stronie wygenerować 6-wyrazowe hasło ze słów. Hasło przechodzi przez PBKDF2 z 600 000 iteracji; z wyniku powstają dwa klucze: Kp do szyfrowania i weryfikator V do późniejszego potwierdzenia hasła. Klucz pliku to HKDF(Kp ‖ H), więc wymaga i hasła, i części klucza z serwera. Przed plikiem trafia losowe pokwitowanie, a AES-GCM szyfruje całość.
Skąd pochodzi kod
Nasz serwer wysyła go razem ze stroną. Subresource Integrity (sprawdzanie, czy przeglądarka dostała dokładnie ten plik, który miała dostać) chroni go w drodze i w pamięciach podręcznych, ale nie przed przejętym serwerem.
Co widzi serwer
Nic. Hasło i Kp nigdy nie opuszczają twojego urządzenia.
Dlaczego
Szyfrogramu i H bez hasła nie da się odszyfrować, tak samo jak szyfrogramu i hasła bez H. Pokwitowaniem odbiorca później udowodni, że odszyfrowanie się udało.

Krok 3 Wysyłanie, etap 2

Serwer widzi: Szyfrogram, V i nazwę pliku

Nigdy nie widzi: Hasła, Kp ani treści

Kto działa
Twoja przeglądarka, potem serwer.
Co przechodzi przez sieć
POST /upload z szyfrogramem w polu file żądania multipart, a do tego file_id, V i SHA-256(receipt). Uwierzytelnia je twoja sesja i token CSRF, a dokończyć je może tylko konto, które wykonało etap 1.
Co widzi serwer
Szyfrogram i jego przybliżony rozmiar, V, skrót pokwitowania, wybrany termin ważności, opcjonalny dopisek dla ciebie i oryginalna nazwa pliku, jawnym tekstem. Zapisuje szyfrogram i wiąże V z H.
Dlaczego
V pozwala serwerowi później sprawdzić hasło, nigdy go nie poznając, i nie da się z niego odtworzyć Kp.

Krok 4 Przekazanie linku

Serwer widzi: Nic

Nigdy nie widzi: Hasła ani tego, komu wysyłasz link

Kto działa
Ty.
Co przechodzi przez sieć
Do nas nic. Link wysyłasz jedną drogą, a hasło najlepiej inną: w innej aplikacji, przez telefon.
Co widzi serwer
Nic. Sam link niczego nie otwiera: wskazuje przesyłkę, a przesyłka wymaga hasła.
Link z hasłem
Strona po wysłaniu podaje też link z hasłem po znaku #. Przeglądarki nigdy nie wysyłają tej części do serwera, więc nadal nie widzimy hasła. Ale każdy, kto ma ten link, może otworzyć przesyłkę, a historia czatu, podglądy linków i eksporty zachowują jego kopię. To wygodne; osobne wysłanie linku i hasła jest bezpieczniejsze.

Krok 5 Odbiorca potwierdza hasło

Serwer widzi: V i adres IP

Nigdy nie widzi: Hasła

Kto działa
Przeglądarka odbiorcy, potem serwer. Odbiorca nie potrzebuje konta, tylko linku i hasła.
Co przechodzi przez sieć
Przeglądarka wyprowadza V z wpisanego hasła i wysyła je do POST /release. Nigdy samo hasło.
Co widzi serwer
V i adres IP odbiorcy, który zapisuje w logu przy udanej i nieudanej próbie. Porównuje V z zapisanym w jednej transakcji bazy danych.
Gdy się zgadza
Serwer wydaje H, raz, i wymazuje H oraz V ze swojej bazy. Zachowuje tylko odcisk jednorazowego biletu do pobrania, który przeglądarka wylicza z H.
Przy nieprawidłowym haśle
Jedno nieprawidłowe hasło blokuje przesyłkę i niszczy H, więc nikt już jej potem nie otworzy, łącznie z odbiorcą. Samodzielnie hostowane instancje mogą ustawić własny limit.
Dlaczego
To dzięki temu jednorazowość jest prawdziwa. Bez H szyfrogram to martwe bajty, a H wychodzi dokładnie raz, po potwierdzeniu hasła, w transakcji, którą może wygrać tylko jeden zgłaszający.

Krok 6 Jednorazowe pobranie

Serwer widzi: Bilet i adres IP

Nigdy nie widzi: Treści ani tego, kim jest odbiorca

Kto działa
Przeglądarka odbiorcy, potem serwer.
Co przechodzi przez sieć
GET /download z biletem. Serwer odsyła szyfrogram strumieniem.
Co widzi serwer
Bilet i adres IP odbiorcy, który zapisuje razem z czasem pobrania.
Potem
Bilet zostaje zużyty, zanim wyjdzie pierwszy bajt, a szyfrogram zostaje usunięty z magazynu, gdy strumień się skończy, nawet jeśli się urwał. Przesyłka wydana, ale niepobrana w ciągu 10 minut, wygasa tak samo.
Dlaczego
Szyfrogram może pobrać tylko przeglądarka, która wygrała wydanie klucza, i nie ma drugiej kopii, po którą można wrócić.

Krok 7 Odszyfrowanie w przeglądarce

Serwer widzi: Że odszyfrowanie się udało

Nigdy nie widzi: Treści ani klucza pliku

Kto działa
Przeglądarka odbiorcy, potem serwer.
Co się dzieje
Przeglądarka składa klucz pliku z Kp (z hasła) i H, odszyfrowuje i wyjmuje pokwitowanie. Plik zapisuje się jako pobrany.
Co przechodzi przez sieć
Pokwitowanie, do POST /report_decryption, żeby twoja lista pokazała przesyłkę jako otwartą i żeby – jeśli o to prosisz – przyszedł do ciebie e-mail.
Co widzi serwer
Pokwitowanie, które pasuje do zapisanego skrótu tylko wtedy, gdy przesyłkę naprawdę odszyfrowano. Serwer dowiaduje się, że odszyfrowanie się udało, ale nigdy nie poznaje treści.

Krok 8 Wygaśnięcie i ręczne usunięcie

Serwer widzi: Zniszczenie H i usunięcie szyfrogramu

Nigdy nie widzi: Treści – ani wtedy, ani nigdy

Kto działa
Serwer albo ty.
Co się dzieje
Gdy termin ważności przesyłki minie albo usuniesz ją ze swojej listy, H zostaje zniszczony, a szyfrogram usunięty z magazynu. Termin ważności jest sprawdzany przy każdym otwarciu linku i cyklicznie (domyślnie co pięć minut). Baza danych nadpisuje to, co usuwa, co zmniejsza, ale nie wyklucza, ryzyko śladów H w jej pliku.
Dlaczego
H nigdy nie przetrwa przesyłki. Nawet gdyby usunięcie szyfrogramu z magazynu się nie powiodło, bez H nie da się go odszyfrować.

Kroków: 8

Co widzi serwer

Wszystko, co do nas trafia, zestawione z tym, co nie trafia nigdy.

  • Treść

    Widzi Szyfrogram i jego przybliżony rozmiar

    Nigdy nie widzi Tekstu jawnego

  • Hasło

    Widzi V, jego jednokierunkowy odcisk

    Nigdy nie widzi Hasła, Kp ani klucza pliku

  • Nazwa

    Widzi Oryginalną nazwę pliku, jawnym tekstem. Jest zapisywana i widoczna na liście przesyłek nadawcy; odbiorca nigdy nie widzi jej na stronie – nazwa, pod którą zapisze plik, przychodzi wewnątrz szyfrogramu.

    Nigdy nie widzi —

  • Ludzie

    Widzi Konto nadawcy; adres IP odbiorcy

    Nigdy nie widzi Tego, kim jest odbiorca

Co przechowujemy i jak długo

  • Szyfrogram

    Do otwarcia

    Dopóki nie zostanie pobrany, nie wygaśnie albo nadawca go nie usunie. Wtedy zostaje usunięty z magazynu.

  • H i V

    Do wydania

    Do udanego wydania klucza, zablokowania przesyłki, jej wygaśnięcia albo usunięcia – zależnie od tego, co nastąpi pierwsze.

  • Wpis o przesyłce

    Dopóki go nie usuniesz

    Nazwa pliku (albo „Secret Note”), konto nadawcy, kiedy przesyłkę utworzono, jej termin ważności, kiedy i z jakiego adresu IP ją otwarto, czy odszyfrowanie się udało, skrót pokwitowania oraz opcjonalny dopisek nadawcy i adres do powiadomień; a także język, w którym ją wysłano i w którym jest pisane powiadomienie. Obok tego to, co zostaje z części klucza po usunięciu H i V: sól hasła, liczba nieudanych prób i czas wydania klucza. Wszystko to zostaje na liście nadawcy, dopóki nadawca tego nie usunie; nic nie czyści tego automatycznie.

  • Logi serwera

    Decyduje operator

    Każda udana i nieudana próba hasła trafia do logu z adresem IP zgłaszającego. Jak długo logi są przechowywane, zależy od tego, kto prowadzi serwer.

Ograniczenia

Przed czym Buzzdrop nie chroni. Żaden projekt tego nie naprawi.

  • Odbiorca może zachować kopię. Odszyfrowany plik albo notatkę można zapisać, skopiować albo sfotografować. Jednorazowość oznacza, że klucz jest wydawany raz, a nie że treści nie da się zachować.

  • Kto prowadzi serwer, ten kontroluje kod. Kod szyfrujący aplikacji w przeglądarce pochodzi z serwera, a Subresource Integrity nie pomoże przeciw samemu serwerowi: ktoś, kto go kontroluje, mógłby podać kod, który wykrada hasło, albo zapisywać V i H. Kod CLI pochodzi za to z GitHub Releases, ale strona odbiorcy zawsze działa w przeglądarce.

  • Słabe hasła. Ktoś, kto ukradnie bazę danych, gdy przesyłka czeka na otwarcie, może sprawdzać hasła względem jej V offline; zapisane pliki nie są do tego potrzebne. 600 000 iteracji PBKDF2 spowalnia każdą próbę; przy długim haśle ze słów szukanie jest beznadziejne, przy krótkim haśle – nie.

  • Link z hasłem to klucz. Kto go ma, może otworzyć przesyłkę.

  • Błędna próba może zniszczyć przesyłkę. Każdy, kto ma link, może wykorzystać jedyną próbę i zablokować ją na stałe, a wtedy prawdziwy odbiorca też jej nie otworzy.

Pełny opis techniczny

Klucze, żądania i trasy serwera stojące za każdym krokiem opisuje plik docs/how-it-works.md w repozytorium Buzzdropa.

Przeczytaj opis techniczny