Aktualności · Bezpieczeństwo w Blackbear
Czego nie możemy przeczytać
Blackbear działa najpierw lokalnie. Każda funkcja działa na twoim urządzeniu i domyślnie twoje dane są tylko tam, bez żadnego serwera po drodze.
Gdy włączysz synchronizację w chmurze, nasze serwery zaczynają przenosić twoje dane między twoimi urządzeniami i twoimi ludźmi. Ta seria wyjaśnia, co to oznacza dla twojej prywatności. Część 1 dotyczy szyfrowania: co opuszcza twoje urządzenie i dlaczego nie możemy tego przeczytać. Część 2 to uczciwy rejestr metadanych, które nasze serwery rzeczywiście przechowują. Część 3 opisuje udostępnianie i współpracę.
Wszystko poniżej opisuje działający kod, a nie zamiary. Gdy podajemy nazwę algorytmu albo liczbę, to ta, która dziś działa w produkcji.
Szyfrowanie odbywa się na twoim urządzeniu
Każda synchronizowana zmiana jest szyfrowana, zanim trafi do sieci. Notatki, dokumenty, zadania, wydarzenia, wpisy w dzienniku, arkusze, płótna, audio, historia wersji. Każda z nich jest zapieczętowana algorytmem XChaCha20-Poly1305, czyli szyfrem z uwierzytelnianiem, przy użyciu klucza, który nigdy nie opuszcza twojego urządzenia bez ochrony. Nasze serwery dostają szyfrogram i przechowują szyfrogram.
Obrazy i pliki audio są traktowane tak samo: szyfrowane na twoim urządzeniu i wysyłane jako nieprzejrzyste bloby.
Kod, który to wszystko robi, to jedna implementacja w Ruście oparta na ekosystemie RustCrypto, skompilowana do WebAssembly. Aplikacja i CLI Blackbear dzielą ją bajt w bajt, a testujemy ją na wspólnych danych testowych dla wielu języków, więc żadna druga implementacja nie może się po cichu rozjechać.
Przed czym to chroni, a przed czym nie
Szyfrowanie to konkretne narzędzie, a nie pole siłowe. Zanim przejdziemy do szczegółów — granice.
Ten projekt chroni cię przed:
- Biernym włamaniem do naszych serwerów lub bazy danych — kradzieżą przechowywanych danych. Wycieka wtedy szyfrogram i opakowane klucze.
- Nami. Nasze działające systemy produkcyjne nigdy nie dostają kluczy do twoich treści ani jawnego tekstu, więc żądanie prawne dotyczące twoich treści daje tylko to, co rzeczywiście mamy: metadane (część 2) i zapieczętowane bloby.
Nie chroni cię przed:
- Przejętym, skradzionym albo odblokowanym urządzeniem. Twoje urządzenie trzyma twoje klucze; jego bezpieczeństwo to fundament, na którym stoi cała reszta.
- Kimkolwiek, kto zna twoje hasło albo twoje dwanaście słów odzyskiwania.
- Tym, co upoważnieni odbiorcy zrobią z tym, co im udostępnisz. Udostępnianie to zaufanie do ludzi, nie tylko matematyka.
- Metadanymi ruchu: kto, kiedy, ile. To cały temat części 2.
- Samą aplikacją. W przeglądarce aplikacja przychodzi z naszych serwerów przy każdym otwarciu; na komputerze — w podpisanych wydaniach. Żaden schemat szyfrowania nie przetrwa złośliwej aplikacji, niezależnie od tego, kto ją dostarcza.
- Chwilami, w których celowo decydujesz się wysłać dane jawnym tekstem: gdy prosisz Paxa o użycie modelu w chmurze, podłączasz zewnętrzny kalendarz, eksportujesz pliki albo wysyłasz zaproszenie e-mailem. Te dane trafiają do wybranej przez ciebie strony i podlegają jej zasadom, a nie naszemu szyfrowaniu.
Hierarchia kluczy
Twoje hasło nigdy nie opuszcza twojego urządzenia. Wszystko z niego wyrasta:
- Twoje hasło przechodzi przez Argon2id, funkcję wyprowadzania klucza wymagającą dużo pamięci, ustawioną na 64 MiB pamięci, trzy przebiegi i cztery tory. Wynikiem jest klucz konta.
- Klucz konta opakowuje klucz sejfu: losowy 256-bitowy klucz wygenerowany na twoim urządzeniu. To klucz sejfu naprawdę szyfruje twoje dane.
- Nasze serwery przechowują opakowany klucz sejfu, sól i parametry. Opakowany klucz sam jest szyfrogramem. Bez twojego hasła to szum.
Serwer przechowuje tylko opakowane kopie: szyfrogram chroniący szyfrogram.
Po co ten pośredni krok? Pozwala zmienić hasło bez ponownego szyfrowania całego twojego życia, a odzyskiwanie może istnieć bez osłabiania drzwi wejściowych.
Przestroga, którą warto zapisać czarno na białym: Argon2id sprawia, że zgadywanie jest kosztowne, ale nie zrobi silnego hasła ze słabego. Opakowany klucz sejfu jest dokładnie tak silny jak hasło, które go opakowuje. Wybierz długie.
Odzyskiwanie to dwanaście słów
Gdy konfigurujesz synchronizację, Blackbear daje ci frazę odzyskiwania: dwanaście słów (BIP39) kodujących 128 bitów entropii. Wyprowadza się z nich niezależny klucz, który opakowuje twój klucz sejfu po raz drugi.
Zapomnisz hasła? Dwanaście słów pozwoli ci wrócić. Stracisz jedno i drugie? Twoje zsynchronizowane dane przepadną. Nie możemy ich zresetować i żadne zgłoszenie do pomocy technicznej nas do tego nie nakłoni, bo po naszej stronie nie ma czego resetować. To nie luka w naszej pomocy. To projekt, który działa tak, jak powinien.
Dodawanie urządzenia
Na nowym urządzeniu wpisujesz hasło. Urządzenie lokalnie wyprowadza z niego klucz konta i odpakowuje klucz sejfu z opakowanej kopii, którą trzyma nasz serwer. Serwer nigdy nie widzi hasła ani wyniku.
Istniejące, odblokowane urządzenie może też przekazać klucz bezpośrednio. Pieczętuje klucz sejfu kluczem publicznym X25519 nowego urządzenia i odkłada go w miejscu przekazania, które samo się niszczy po pięciu minutach, użyte czy nie. Uczciwie o jednej granicy: twoje istniejące urządzenie poznaje klucz publiczny nowego urządzenia przez twoje zalogowane konto, więc ta wspomagana ścieżka ufa, że nasz serwer przekaże właściwy klucz wybranego przez ciebie urządzenia. Ścieżka z hasłem takiego zaufania nie wymaga.
Ponieważ dokładnie tego słownictwa użyłby oszust, zasada warta zapisania czarno na białym: nigdy nie poprosimy cię o hasło ani słowa odzyskiwania i nigdy nie poprosimy o zatwierdzenie przekazania na nowe urządzenie. Takie pytania należą wyłącznie do aplikacji, którą otworzysz samodzielnie. Każdy inny, kto o to prosi, to atak.
Wiadomości
Wiadomości używają własnych kluczy, oddzielnych od synchronizacji. Każde konto ma tożsamość do wiadomości opartą na X25519, a każda wiadomość wyprowadza unikalny klucz ze świeżej soli przez HKDF-SHA256. Wiadomości podróżują jako zapieczętowane koperty. Serwer je przekazuje; nie może ich otworzyć. Część 2 opisuje, co zdradza wierzch koperty.
Jedna uwaga o projekcie, powiedziana wprost: unikalne klucze dla każdej wiadomości to nie mechanizm zapadki z rotacją kluczy, którego używają niektóre komunikatory. Gdyby długoterminowy klucz wiadomości urządzenia został kiedyś przejęty, zagrożone byłyby wiadomości zapieczętowane dla niego. Klucze dla każdej wiadomości ograniczają zasięg szkód; nie są utajnianiem przekazywania (forward secrecy) i wolimy, żeby ta różnica była dla ciebie jasna.
Historia bez odcisków treści
Historia wersji synchronizuje się jako zaszyfrowane migawki, adresowane identyfikatorami w obrębie twojego sejfu. Jeśli ty i ktokolwiek obcy zapiszecie identyczny plik, serwer zobaczy dwa niepowiązane identyfikatory: identycznej zawartości nie da się dopasować między kontami. Rozmiar i czas pozostają widoczne, jak w całym ruchu synchronizacji. To metadane, a ten temat należy do części 2.
Dowód bez ujawniania
Nieodwracalne operacje na koncie wymagają dowodu posiadania sejfu: podpisu kluczem Ed25519 wyprowadzonym z klucza sejfu. Dowodzisz, że masz sejf, a sam sejf nigdzie nie podróżuje. A gdy klucze skończą pracę w pamięci, są zerowane.
Nic z tego nie jest egzotyczne. XChaCha20-Poly1305, Argon2id, X25519, Ed25519, HKDF-SHA256: standardowe, nudne, gruntownie przebadane prymitywy. Ciekawa jest dyscyplina stosowania ich wszędzie i mówienia na głos, czego nie obejmują. O tej dyscyplinie jest reszta tej serii.
Dalsza lektura
- Local-first software — esej Ink & Switch, z którego wyrosła ta filozofia
- RFC 9106 — specyfikacja Argon2
- XChaCha20-Poly1305 — projekt specyfikacji IETF
- RFC 7748 — krzywe eliptyczne stojące za X25519
- RFC 8032 — podpisy Ed25519
- The Password Hashing Competition — konkurs, który wygrał Argon2
Bezpieczeństwo w Blackbear
- 1. Czego nie możemy przeczytać (jesteś tutaj)
- 2. Co widzą nasze serwery
- 3. Jak udostępnianie pozostaje zapieczętowane