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: 17 września 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
- 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.
- 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.
- W API nie działa żadna biblioteka zewnętrzna do śledzenia błędów ani analityki. Analityka w przeglądarce na stronach WWW jest uwarunkowana zgodą i nigdy nie widzi ruchu API.
Gdzie leżą dane
| Co | Gdzie |
|---|---|
| Aplikacja i API | Vercel, region frankfurcki (fra1) |
| Baza danych | MongoDB Atlas |
| Wgrane pliki (wyciągi, zdjęcia, dokumenty) | Magazyn obiektowy: Vercel Blob albo Cloudflare R2, zależnie od konfiguracji wdrożenia |
| Publiczne dane referencyjne (cenniki, statystyki) | Cloudflare R2 |
| Dzienna kopia zapasowa bazy | Archiwum z mongodump zaszyfrowane AES-256 jeszcze zanim opuści serwer buildu, przechowywane jako artefakt GitHub Actions |
| 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 Facebook (OAuth).
- Opcjonalne uwierzytelnianie dwuskładnikowe aplikacją TOTP z kodami zapasowymi. Sekret TOTP jest zaszyfrowany.
- Konto jest blokowane po powtarzających się nieudanych próbach logowania.
- Sesję trzyma ciasteczko z flagą HTTP-only, wydawane przez bibliotekę Auth.js.
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 oraz notatki Family Legacy. Zaszyfrowanych pól nie da się przeszukiwać zapytaniem do bazy, a odszyfrowywane są dopiero przy wyświetleniu rekordu.
- 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.
Połączenie AI krok po kroku
Tak wygląda zapytanie do Claude albo ChatGPT, 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. Narzędzie zapisujące wymaga uprawnienia
writeoraz planu Premium albo Max. Bez któregokolwiek z nich wywołanie kończy się błędem i nic się nie wykonuje. Bez obu narzędzia zapisujące nie są klientowi nawet oferowane. 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), a każda lista, na której się pojawia (transakcje, transakcje giełdowe, odczyty, kosztowności, budżety), oznacza go etykietą „AI”, której podpowiedź podaje kanał i narzędzie. - 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.
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 unieważnia wszystkie jego tokeny naraz.
- 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.
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 i z interfejsu WWW. Na ścieżce MCP nieużywany. | Zarządza administrator |
Czego tam natomiast nie ma:
- Żadnego Sentry, Datadog, PostHog ani podobnej biblioteki w API. 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.
Państwa prawa do danych
- Eksport: 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.
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 i ChatGPT 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ę.
Zgłaszanie problemu bezpieczeństwa
Prosimy napisać na info@assetli.app i w temacie podać „security”. Prosimy nie testować na danych innych użytkowników.