TL;DR
Tak, Twoje dane nas nie interesują. Są domyślnie szyfrowane na Twoim urządzeniu, co oznacza, że nasze serwery ani bazy danych nigdy ich nie widzą ani nie rejestrują.
Dane przechowywane na Twoim urządzeniu
Podstawową zasadą Capitally jest to, że wszystkie Twoje dane są szyfrowane i przechowywane na Twoim urządzeniu. Nasze serwery przechowują jedynie kopię Twojego projektu na potrzeby synchronizacji między urządzeniami — jednak ponieważ tylko Ty masz dostęp do kluczy szyfrowania, nie możemy zobaczyć rzeczywistych danych. Możesz też bez żadnych konsekwencji zablokować te żądania.
Jedyne, co „widzimy", to symbole rynkowe, z którymi wchodziłeś w interakcję — których szukałeś lub dla których pobierałeś ceny — jednak nie łączymy tych informacji z Twoim kontem.
Projekty są domyślnie szyfrowane
Szyfrując Twoje dane, chronimy je przed:
- nieautoryzowanym dostępem do danych przechowywanych w naszych bazach danych — ze strony pracowników, hakerów lub instytucji rządowych
- nieautoryzowanym dostępem na Twoim urządzeniu — o ile chronisz profil przeglądarki przed bezpośrednim dostępem i nie wybierasz opcji „Zapamiętaj mnie" podczas logowania
Nie możemy natomiast chronić przed:
- atakami typu supply-chain lub man-in-the-middle, w których atakujący podmieniają nasz kod źródłowy
- nieautoryzowanym zapisem lub usunięciem danych w naszych bazach danych lub na urządzeniu klienta
- wykrywaniem aktywności projektu — metadane projektu, takie jak typ operacji (transakcja utworzona, zaktualizowana, usunięta itp.) oraz znaczniki czasu (moment wprowadzenia zmiany, nie sama transakcja) nie są szyfrowane
Tryby szyfrowania
Podczas tworzenia projektu możesz wybrać szyfrowanie za pomocą:
- Hasła użytkownika — podczas logowania używamy
PBKDF2do wyprowadzenia dwóch haseł z jednego podanego przez Ciebie, używając dwóch osobnych soli. Pierwsze hasło służy do uwierzytelnienia — dzięki temu nasze serwery autoryzacyjne (Google Identity Platform) nigdy nie otrzymują wpisanego przez Ciebie hasła, co uniemożliwia wyprowadzenie z niego drugiego hasła. To drugie hasło służy do zaszyfrowania (za pomocąAES-GCM) zestawu kluczy prywatnych używanych do szyfrowania projektu. Istnieje opcja bezpiecznego przechowywania klucza szyfrowania w przeglądarce, dzięki czemu nie musisz go wpisywać ponownie. - Hasła projektu — działanie jest analogiczne jak powyżej, z tą różnicą, że zostaniesz poproszony o osobne hasło projektu, które posłuży do wyprowadzenia klucza szyfrowania.
- Klucza zdalnego — po zalogowaniu aplikacja pobiera klucz szyfrowania z serwera. Klucz nie jest przechowywany w bazie danych — jest wyprowadzany z kombinacji danych uwierzytelniających użytkownika, soli i naszego własnego klucza prywatnego. Endpoint jest odizolowany od pozostałych i jako jedyny ma dostęp do tego klucza.
Każdy użytkownik projektu (obecnie może być tylko jeden, jednak system jest gotowy na wprowadzenie współdzielenia projektów) posiada zestaw kluczy prywatnych i publicznych (RSA-OAEP). Klucz prywatny jest szyfrowany wspomnianym wcześniej głównym kluczem szyfrowania. Służy do odszyfrowania klucza współdzielonego (kolejny AES-GCM), który z kolei jest używany do szyfrowania i odszyfrowywania danych projektu. Na jeden projekt może przypadać wiele kluczy współdzielonych (np. dla każdego zestawu danych udostępnianych między tymi samymi użytkownikami).
Klucz publiczny służy do szyfrowania kluczy współdzielonych wydawanych użytkownikowi oraz do podpisywania wiadomości generowanych przez backend (np. nowych transakcji od brokera) — tak aby tylko użytkownik mógł je odczytać.
Warto zaznaczyć, że po wpisaniu hasła nie jest ono nigdzie przechowywane ani wysyłane. Klucze szyfrowania mogą być przechowywane, ale nie można ich eksportować — oznacza to, że można ich użyć do odszyfrowania danych, jednak sam klucz nie jest możliwy do odczytania. Aplikacja dosłownie nie ma do niego dostępu.
Do wszystkich zadań związanych z szyfrowaniem, w tym generowania liczb losowych, używamy webcrypto
Czy kod jest otwartoźródłowy i zweryfikowany?
Capitally to projekt zamkniętoźródłowy, jednak aplikacja kliencka jest napisana w TypeScript, a całe przetwarzanie danych odbywa się po stronie klienta. Całą komunikację sieciową można też łatwo zweryfikować w narzędziach deweloperskich przeglądarki.
Jak w przypadku każdego oprogramowania, wszystko sprowadza się do zaufania. Musisz nam ufać, że my (ani żaden haker) nie zmienimy potajemnie tego kodu i nie wykradniemy kluczy szyfrowania ani haseł.
Sami z tego korzystamy
Zdecydowaliśmy się wdrożyć szyfrowanie end-to-end, ponieważ sami chcemy zachować prywatność własnych danych finansowych. Dokładamy wszelkich starań, aby tak pozostało.
Analityka i śledzenie błędów
Nie chcemy znać Twoich danych finansowych, jednak aby ulepszać aplikację i pomagać Ci w razie problemów, zbieramy pewne dane o sposobie korzystania z niej — jeśli nam na to pozwolisz. Zbieramy konkretnie:
- Twoje ID użytkownika
- URL strony, który może zawierać ID aktywa
- URL żądań sieciowych (które będą zawierać ID aktywów rynkowych)
- elementy, które klikasz (tylko ich systemowe ID)
- systemowe komunikaty dziennika (które mogą zawierać ID aktywów rynkowych)
Jeśli nie zezwolisz nam na identyfikację, nie będziemy przechowywać żadnego z wymienionych powyżej ID. W takim przypadku rejestrujemy jedynie błędy oraz minimalne dane o użyciu funkcji — w całkowicie anonimowy sposób, bez ID ani szczegółowych logów.
Rzeczy, których nigdy nie zbieramy:
- wielkość ani wartość Twoich inwestycji
- nazwy, notatki ani żaden tekst tworzony przez Ciebie
- niestandardowe źródła kursów