Bezpieczeństwo i przepływ danych
Gdzie leżą Państwa dane, co jest zaszyfrowane, jak jest uwierzytelnione i ograniczone połączenie AI, co Assetli loguje, co widzi dostawca AI i czego jeszcze nie potrafimy.
Ostatnia aktualizacja: 30 października 2026
Ta strona jest napisana dla technicznie biegłego i sceptycznego czytelnika. Każde twierdzenie poniżej zostało zweryfikowane wobec kodu aplikacji w dniu podanym powyżej. To, co jest ograniczeniem, a nie funkcją, znajdą Państwo w rozdziale Czego jeszcze nie potrafimy, oznaczone jako planowane.
Podsumowanie
Dwie kolejne strony idą głębiej: Kto przetwarza Państwa dane wymienia każdą stronę trzecią i to, co otrzymuje, Jak długo dane są przechowywane podaje okres przechowywania każdego rekordu.
- Assetli nigdy nie łączy się z Państwa bankiem i nie przechowuje danych logowania do bankowości. Dane trafiają do aplikacji przez import pliku, wpis ręczny albo opcjonalną synchronizację z Wallet by BudgetBakers przy użyciu tokenu tamtej aplikacji.
- Załączone pliki leżą w prywatnym magazynie w UE bez publicznego adresu i są wyświetlane tylko zalogowanemu właścicielowi.
- Przy włączonym uwierzytelnianiu dwuskładnikowym kod jest wymagany przy każdym logowaniu hasłem. Po logowaniu przez Google albo Apple kod Assetli nie jest wymagany — weryfikację zapewnia tam Państwa konto Google albo Apple. Przycisk „Wyloguj ze wszystkich urządzeń” kończy wszystkie logowania, łącznie z aplikacją mobilną i połączeniami z AI.
- Połączenie AI opiera się na OAuth 2.1 z PKCE, ekranie zgody, krótko ważnych tokenach przechowywanych jako skrót, jednym profilu na konektor i oddzielnym uprawnieniu do odczytu i do zapisu. Zapis wymaga planu płatnego.
- Państwa rozmowa z AI nie dociera do Assetli. Serwer otrzymuje wyłącznie wywołania narzędzi. Odczyty nie są logowane, zapisy są logowane przez 12 miesięcy.
- Ani w API, ani w aplikacjach mobilnych (Android i iPhone) nie działa żadna biblioteka zewnętrzna do śledzenia błędów ani analityki. Google Analytics i Microsoft Clarity ładują się na stronach WWW dopiero po zgodzie na pliki cookie i nigdy nie widzą ruchu API; Vercel Web Analytics liczy wyświetlenia stron na stronie WWW i w panelu bez plików cookie.
Gdzie leżą dane
| Co | Gdzie |
|---|---|
| Aplikacja i API | Vercel, region frankfurcki (fra1) |
| Baza danych | MongoDB Atlas, region frankfurcki (UE) |
| Załączone pliki (zdjęcia, dokumenty, paragony) | Cloudflare R2, prywatny magazyn z jurysdykcją UE (obiekty pozostają w UE), bez publicznego adresu. Plik wyświetla się tylko zalogowanemu właścicielowi: serwer sprawdza logowanie i to, czy rekord należy do aktywnego profilu, a następnie wydaje podpisany link ważny najwyżej 15 minut albo sam przesyła plik (podgląd w przeglądarce, zdjęcia kosztowności). Sam link nie wymaga logowania, dlatego jest ważny krótko. Pliki wgrane wcześniej przenieśliśmy 30.10.2026 do UE, a oryginalne kopie usunęliśmy. Ikony subskrypcji i budżetów oraz pliki tymczasowe są w Vercel Blob. Wyciągi do importu w ogóle nie są przechowywane |
| Publiczne dane referencyjne (cenniki, statystyki) | Cloudflare R2, osobny publiczny magazyn (bez plików użytkowników) |
| Kopia zapasowa bazy | Archiwum z mongodump zaszyfrowane AES-256 (ze sprawdzeniem, że daje się odszyfrować), przechowywane na własnym komputerze operatora w Czechach; zaplanowane co noc. Kopie starsze niż 30 dni są usuwane, ale 7 ostatnich kopii zostaje zawsze, nawet jeśli są starsze. Druga kopia, zaszyfrowana jeszcze zanim opuści serwer buildu, jest zapisywana jako artefakt GitHub Actions na 30 dni, tylko gdy to zadanie tam działa (od 21.10.2026 nie działa). Nocna kopia zapasowa obecnie się nie udaje, zob. Czego jeszcze nie potrafimy |
| Kursy walut | Pobierane z frankfurter.app (kursy EBC). Zapytanie niesie wyłącznie kody walut |
| Płatności | Stripe. Dane karty nie docierają do Assetli |
Logowanie do Assetli
- E-mailem i hasłem. Hasła są przechowywane jako skrót algorytmem bcrypt.
- Logowanie przez Google albo Apple (OAuth), w aplikacji na telefon także natywnie.
- Opcjonalne uwierzytelnianie dwuskładnikowe aplikacją TOTP z kodami zapasowymi. Gdy jest włączone, kod (z aplikacji uwierzytelniającej albo zapasowy) jest wymagany przy każdym logowaniu hasłem, w przeglądarce i w aplikacji, oraz przy wejściu do panelu administracyjnego operatora.
- Po logowaniu przez Google albo Apple kod Assetli nie jest wymagany, ani w przeglądarce, ani w aplikacji. Weryfikację zapewnia tam Państwa konto Google albo Apple (klucz dostępu, czyli passkey, ich weryfikacja dwuetapowa; Apple wymaga jej przy logowaniu przez Apple). Zalecamy włączyć tam weryfikację dwuetapową lub klucz dostępu.
- Sekret TOTP jest zaszyfrowany, tego samego kodu nie da się użyć dwa razy, a kod zapasowy działa tylko raz.
- Po 5 nieudanych próbach w ciągu 15 minut konto blokuje się na 15 minut; liczą się też błędne kody dwuskładnikowe, niezależnie od tego, czy zostały wpisane przy logowaniu, w aplikacji, czy w Ustawieniach (wyłączenie weryfikacji, nowe kody zapasowe).
- Sesję trzyma ciasteczko z flagą HTTP-only, wydawane przez bibliotekę Auth.js; jest ważne 7 dni od ostatniego użycia.
- Wyloguj ze wszystkich urządzeń (Ustawienia w przeglądarce i w aplikacji) kończy wszystkie sesje w przeglądarkach, unieważnia tokeny aplikacji mobilnej, dodatku do Arkuszy Google i wszystkich połączeń z AI (MCP) oraz usuwa rejestracje powiadomień na telefon. To samo dzieje się automatycznie po odzyskaniu hasła. Po włączeniu lub wyłączeniu uwierzytelniania dwuskładnikowego pozostałe urządzenia zostają wylogowane, a zalogowane zostaje tylko to, na którym wprowadzono zmianę. Pozostałe instancje serwera przejmują zmianę najpóźniej w ciągu 30 sekund.
- E-maile dotyczące bezpieczeństwa przychodzą po logowaniu z nowego urządzenia, po odzyskaniu hasła i po wyłączeniu uwierzytelniania dwuskładnikowego. Urządzenie rozpoznajemy po rodzaju, przeglądarce i systemie, bez wersji i bez adresu IP; w bazie jest tylko ich skrót. E-mail podaje urządzenie, przybliżony kraj, czas i sposób logowania. Z tych e-maili nie można się wypisać.
- Panel administracyjny wpuszcza operatora tylko z uwierzytelnianiem dwuskładnikowym potwierdzonym w tej samej sesji i każdy dostęp zapisuje w rejestrze audytowym (patrz Logowanie zdarzeń poniżej).
Szyfrowanie
- Cały ruch idzie przez HTTPS.
- Szyfrowanie na poziomie pól algorytmem AES-256-GCM (wersjonowany zapis, losowy wektor inicjujący, znacznik uwierzytelnienia) chroni: numer rachunku, IBAN i notatki przy rachunkach bankowych, token do Wallet by BudgetBakers, sekrety uwierzytelniania dwuskładnikowego, Państwa własne klucze API do dostawców AI, notatki Family Legacy oraz dane płatnicze członków grup wspólnych wydatków (numer rachunku lub IBAN, nazwa i kod banku, adres portfela kryptowalutowego; publiczny link grupy w ogóle ich nie otrzymuje). Zaszyfrowanych pól nie da się przeszukiwać zapytaniem do bazy, a odszyfrowywane są dopiero przy wyświetleniu rekordu. Zaszyfrowane są też token odświeżający logowania przez Apple, identyfikatory zakupów z Google Play i Państwa tajny adres do importu e-mailem.
- Tokeny dostępowe i odświeżające OAuth, kody autoryzacyjne i klucze API są przechowywane jako skrót SHA-256. Postać czytelna istnieje wyłącznie w Państwa kliencie. Tak samo tokeny z linków do odzyskania hasła i weryfikacji e-maila: w bazie jest tylko skrót, czytelny link istnieje tylko w e-mailu i każdy działa jeden raz.
Połączenie AI krok po kroku
Tak wygląda zapytanie do Claude, ChatGPT albo Gemini, które potrzebuje Państwa danych.
- Klient wywołuje
POST /api/mcpz ciałem JSON-RPC, czyli nazwą narzędzia i jego argumentami. Nic więcej z rozmowy nie jest wysyłane. - Middleware przepuszcza żądanie. Na tej ścieżce nie ma hasła do całej witryny i nie loguje się ciała żądania.
- Weryfikacja tokenu. Token z nagłówka
Authorization: Bearerjest hashowany i wyszukiwany w bazie. Musi istnieć, nie być wygasły (1 godzina), nie być unieważniony, a jego odbiorca musi zgadzać się z hostem. Z rekordu odczytywane są Państwa identyfikator, profil wybrany przy zgodzie, uprawnienia i identyfikator klienta. - Uprawnienie, plan i token z podglądu. Każde narzędzie z kategorii zapisu, łącznie z podglądami (
prepare_*), wymaga uprawnieniawriteoraz planu Premium albo Max. Bez uprawnieniawritenarzędzia zapisujące nie są klientowi oferowane, a wywołanie kończy się błędemSCOPE_REQUIRED. Z uprawnieniemwritesą oferowane także w planie Free, aby zapis działał od razu po przejściu na Premium, ale każde wywołanie bez planu Premium albo Max kończy się błędemTIER_FEATUREi nic się nie wykonuje. Kontrola planu przebiega przy każdym wywołaniu, a nie w wykazie narzędzi, więc obowiązuje także po końcu okresu próbnego. Zapis musi ponadto nieść token potwierdzający, wydany przez odpowiadające mu narzędzie podglądu dla tych samych argumentów w ciągu ostatnich dziesięciu minut; bez niego albo z innymi argumentami zapis zostaje odrzucony. - Wykonanie narzędzia. Obsługa odpytuje MongoDB z filtrem na Państwa użytkownika i profil. Wyniki są składane w stały zestaw pól.
- Audyt (tylko przy zapisach). Nazwa narzędzia, identyfikator klienta, wynik i podsumowanie argumentów trafiają do kolekcji
mcp_audit_logsz wygaśnięciem po 365 dniach. Kwoty, kategorie, symbole, daty i nazwy celów pozostają; tekst swobodny (opisy, notatki, nazwa sprzedawcy, treść wyciągu) zapisywany jest wyłącznie jako długość, treść wyciągu dodatkowo jako skrót. Sam rekord niesie pochodzenie (createdVia: MCP i identyfikator konektora) — transakcje, transakcje giełdowe, odczyty, kosztowności, budżety i reguły kategoryzacji — a listy transakcji, transakcji giełdowych, odczytów, kosztowności i budżetów oznaczają go etykietą „AI”, której podpowiedź podaje kanał i narzędzie. Akcje, które zmieniają istniejące rekordy zamiast tworzyć nowy (sparowanie przelewu, zastosowanie reguły, przesunięcie pieniędzy między kopertami, potwierdzenie salda), są zapisywane w dzienniku audytu. - Odpowiedź. Wynik w JSON wraca do klienta, który przekazuje go modelowi.
Co Assetli widzi, a czego nie
| Czy Assetli widzi? | |
|---|---|
| Państwa pytanie i odpowiedzi modelu | Nie. Zostają w kliencie AI. |
| Nazwa narzędzia i argumenty | Tak, na czas obsługi żądania. |
| Argumenty wywołań zapisujących | Tak, jako podsumowanie bez tekstu swobodnego, w logu audytu przez 12 miesięcy. |
| Argumenty wywołań odczytujących | Nie są zapisywane. |
| Wyniki narzędzi | Są obliczane i zwracane, nie są zapisywane. |
| Tożsamość klienta | Zarejestrowana nazwa konektora i jego identyfikator. W standardowych logach hostingu również adres IP i identyfikacja przeglądarki serwera klienta AI. |
Zdanie „widzimy tylko to, co przy klikaniu w aplikacji” jest ścisłe przy odczycie. Przy zapisie Assetli zachowuje nieco więcej niż przy kliknięciu w aplikacji, mianowicie rekord audytu.
Co widzi dostawca AI
Dostawca prowadzący Państwa model (Anthropic przy Claude, OpenAI przy ChatGPT, Google przy Gemini) widzi Państwa pytania, wyniki narzędzi, a zatem każdą liczbę, którą narzędzie zwróci. Tymi danymi zarządza się zgodnie z warunkami danego dostawcy, nie z warunkami Assetli. Narzędzia zwracają te same dane, które widzą Państwo w aplikacji: salda, transakcje z opisem i sprzedawcą, pozycje, wartości i adresy nieruchomości, numery rejestracyjne pojazdów, długi. Nigdy nie zwracają numerów rachunków, IBAN, haseł, tokenów ani danych innych użytkowników.
Asystent w aplikacji działa inaczej. Tam Państwa wiadomości i migawkę finansową wysyła do Anthropic (albo do dostawcy, którego klucz Państwo podali) samo Assetli, a rozmowa zapisywana jest przy Państwa profilu. Zob. Asystent AI.
Zakres tokenu
- Jeden użytkownik, jeden profil. Token niesie profil wybrany przy zgodzie. Konektor nie może przełączać profili.
- Odczyt albo zapis. Nadawane na ekranie zgody, zapis obejmuje odczyt. Serwer sprawdza uprawnienie przy każdym wywołaniu.
- Powiązany z odbiorcą. Token wydany dla
assetli.appzostanie odrzucony przez każdy inny host. - Krótko ważny. Token dostępowy 1 godzina, odświeżający 60 dni, wymieniany na nowy przy każdym odświeżeniu.
- Odwoływalny. Menu konta → Połączenie AI (MCP) wypisuje każdy konektor i po potwierdzeniu unieważnia wszystkie jego tokeny naraz. „Wyloguj ze wszystkich urządzeń” w Ustawieniach unieważnia tokeny wszystkich konektorów jednocześnie.
- Bez dzielenia się sekretami. Klienci są publicznymi klientami OAuth z PKCE, nie istnieje żaden sekret klienta, a Państwa hasło nigdy nie opuszcza Assetli.
- Wyłącznie endpoint MCP. Token konektora zewnętrznego przyjmuje
/api/mcpi nic poza tym. REST API przyjmuje tokeny Bearer wyłącznie od własnej aplikacji mobilnej.
Ten sam serwer OAuth wydaje tokeny także aplikacji Assetli na Androida i iPhone’a, która jest jeszcze w zamkniętych testach i nie jest publicznie dostępna. Zalogować się w niej można e-mailem i hasłem, przez Google albo Apple bezpośrednio w aplikacji lub w przeglądarce systemowej; hasło i kod dwuskładnikowy sprawdza ta sama funkcja co w przeglądarce, łącznie z blokadą prób (przy koncie z uwierzytelnianiem dwuskładnikowym aplikacja wymaga kodu po logowaniu hasłem; po logowaniu przez Google albo Apple nie, tam weryfikację zapewnia konto Google albo Apple), a tokeny wydaje ta sama funkcja co /api/oauth/token (dostępowy 1 godzina, odświeżający 60 dni). Ekran zgody aplikacja pomija, bo jest nasza. Tokeny przechowuje w bezpiecznym magazynie telefonu (Android Keystore, na iPhonie pęk kluczy) i można je odwołać na tej samej stronie Połączenie AI (MCP) albo przyciskiem „Wyloguj ze wszystkich urządzeń”.
Logowanie zdarzeń
| Log | Zawartość | Przechowywanie |
|---|---|---|
| Log audytu MCP (baza) | Użytkownik, profil, identyfikator klienta, nazwa narzędzia, powodzenie albo błąd, podsumowanie argumentów bez tekstu swobodnego. Tylko zapisy. Widoczny w menu konta → Połączenie AI (MCP). | 365 dni |
| Log żądań hostingu (Vercel) | Metoda, ścieżka, status, czas obsługi, IP klienta. Bez ciał żądań. | Zależnie od planu Vercel |
| Wyjście funkcji (Vercel) | Komunikaty błędów wypisywane przez aplikację przy awarii, na przykład błąd bazy. Nie ciała żądań. | Zależnie od planu Vercel |
| Log błędów administratora (baza) | Błędy aplikacji z wybranych endpointów, z interfejsu WWW i z aplikacji mobilnych (Android i iPhone): treść i zapis techniczny błędu, strona lub ekran, wersja aplikacji i systemu, identyfikator konta jako pseudonim (bez imienia i e-maila), adres IP i User-Agent. Na ścieżce MCP nieużywany. | 12 miesięcy, potem automatycznie usuwany |
| Rejestr dostępów do panelu administracyjnego (baza) | Kto, kiedy, metoda, ścieżka i identyfikatory z adresu (ID użytkownika lub rekordu, kolekcja). Żadnej treści wyświetlonej w panelu, żadnego adresu e-mail. To samo żądanie w ciągu 30 sekund jest zapisywane raz. Usunięcie konta nie usuwa zapisu o tym, że je przeglądano. | 365 dni, potem usuwany automatycznie |
Czego tam natomiast nie ma:
- Żadnego Sentry, Datadog, PostHog ani podobnej biblioteki w API ani w aplikacjach mobilnych (Android i iPhone). Zależność tego rodzaju w projekcie nie istnieje.
- Żadnego middleware przechwytującego ciała żądań albo odpowiedzi.
- Google Analytics i Microsoft Clarity ładują się wyłącznie w przeglądarce na stronach WWW i dopiero po zgodzie na ciasteczka. Ruch API i MCP nigdy do nich nie dociera. Jedynym wyjątkiem jest jedno zdarzenie rejestracji: gdy zakładają Państwo konto, nasz serwer zgłasza je do Google Analytics — tylko jeśli wyrazili Państwo zgodę na analitykę (w przeciwnym razie ciasteczko Analytics nie istnieje i nic nie jest wysyłane). Zawiera anonimowy identyfikator Analytics i stronę, z której Państwo przyszli, nigdy imienia, e-maila ani danych finansowych.
- Vercel Web Analytics liczy wyświetlenia stron na stronie WWW i w panelu (w aplikacji mobilnej nie) bez plików cookie i bez zgody; identyfikator wizyty to skrót ważny jeden dzień. Ruchu API i MCP nie widzi.
Pozostałe połączenia
- Wallet by BudgetBakers (Premium, Max): wklejają Państwo token API z Walleta, Assetli zapisuje go zaszyfrowany i z API Walleta tylko czyta. Nigdy nie zapisuje do Walleta. Po odłączeniu token jest usuwany. Technicznie pozwalałby też na zapis; Assetli używa go tylko do odczytu.
- Klucze API (
ask_…): osobny typ klucza tylko do odczytu, przeznaczony dla API danych (cenniki energii, oprocentowanie kredytów hipotecznych i oszczędności). Nie daje dostępu do danych finansowych. Są przechowywane jako skrót SHA-256, można je ograniczyć do odczytu, nadać im datę wygaśnięcia i unieważnić w Ustawieniach. Połączenie AI z nich nie korzysta. - Dodatek do Arkuszy Google: własny typ tokenu, który przyjmują tylko dwa endpointy przy hipotekach. Jest wypisany i możliwy do unieważnienia na tej samej stronie połączeń.
- Rozszerzenie przeglądarki do sprawdzenia nieruchomości: odczytuje ogłoszenie otwarte w Państwa przeglądarce i wysyła jego tekst do endpointu analizy. Serwer sam nie odwiedza portali nieruchomości. Z góry ma dostęp tylko do assetli.app; po kliknięciu ikony prosi o uprawnienie do witryny otwartej karty, a Chrome pyta o zgodę, jeśli nie została jeszcze udzielona. Po otwarciu panelu wysyła adres otwartej strony, aby sprawdzić, czy była już analizowana; treść strony odczytuje dopiero po kliknięciu „Analizuj tę stronę”.
Państwa prawa do danych
- Eksport (na stronie WWW i w aplikacji mobilnej): Ustawienia → Eksport danych tworzy plik ze wszystkimi rekordami należącymi do Państwa, w każdej kolekcji, bez sekretów uwierzytelniania i logów tymczasowych.
- Usunięcie: Ustawienia → Usuń konto usuwa użytkownika i każdy powiązany z nim rekord, łącznie z rekordami należącymi do grup wydatków i kontaktu Family Legacy oraz z plikami. Wymagana jest fraza potwierdzająca. W aplikacji mobilnej (Android i iPhone): Więcej → Ustawienia → Usuń konto. Szczegóły: Usunięcie konta.
Czego jeszcze nie potrafimy
Wolimy to wypisać, niż żeby znaleźli to Państwo sami.
- Potwierdzenie jest wymuszane jako parowanie, nie jako zgoda. Serwer odrzuca zapis, który nie ma tokenu z odpowiadającego mu podglądu dla tych samych argumentów z ostatnich dziesięciu minut. To, czy podgląd rzeczywiście Państwo widzieli i powiedzieli tak, pozostaje po stronie klienta AI; Claude, ChatGPT i Gemini dodają własne pytanie o zezwolenie na narzędzie.
- Czas przechowywania logów po stronie hostingu zależy od planu Vercel i nie jest sterowany przez aplikację.
- Automatyczna nocna kopia zapasowa bazy od 22.10.2026 się nie udaje. Naprawiamy to. Druga kopia w GitHub Actions od 21.10.2026 również nie powstaje.
- Prace rozwojowe korzystają z produkcyjnej bazy danych. Operator ma dostęp do danych w celu utrzymania usługi, naprawy błędów i rozwoju, i tylko w niezbędnym zakresie. Prace rozwojowe i skrypty kontrolne działają na produkcyjnej bazie danych, a niektóre z nich przechodzą przez profile użytkowników (na przykład kontrola, czy AI pokazuje te same liczby co strona WWW). Operator korzysta przy tym z asystenta programowania AI firmy Anthropic, więc wynik takich skryptów może przetwarzać Anthropic jako podmiot przetwarzający. Oddzielna baza do prac rozwojowych to nasz największy otwarty punkt.
- Narzędzie bazy danych w panelu administracyjnym potrafi rekordy także zmieniać i usuwać. Wejście do niego wymaga uwierzytelniania dwuskładnikowego i jest rejestrowane; zaszyfrowane pola pokazuje tylko jako szyfrogram, a hasła, tokeny OAuth i klucze API są w bazie tylko jako skróty.
- Znanych podatności w bibliotekach nie monitoruje jeszcze żadna automatyka. Wprowadzamy alerty.
Zgłaszanie problemu bezpieczeństwa
Zgłoszenia przyjmujemy pod adresem info@assetli.app, w temacie proszę podać „security”. Prosimy nie testować na danych innych użytkowników.