LibrePass — menedżer haseł uruchamiany na własnym serwerze
LibrePass był rozwijanym przeze mnie menedżerem haseł, który połączył natywną aplikację na Androida, backend Spring Boot i szyfrowaną synchronizację. Projekt pozwolił mi przejść przez cały proces budowy produktu — od interfejsu i pracy offline po API, wdrożenie oraz granice bezpieczeństwa.
01
Problem
Menedżer haseł musi pogodzić łatwy dostęp do danych na urządzeniu z ochroną przed osobami i usługami, które nie powinny znać ich treści. Sam formularz logowania i baza wpisów nie wystarczą — produkt musi uwzględniać szyfrowanie, blokowanie sejfu, pracę bez internetu i synchronizację.
Uruchamianie na własnym serwerze dodawało kolejne wymaganie: użytkownik powinien móc obsługiwać własny serwer, ale backend nie powinien potrzebować dostępu do jawnej zawartości sejfu.
02
Rozwiązanie
LibrePass powstał jako zestaw współpracujących aplikacji open source. Natywny klient Android zapewniał pracę z sejfem i danymi lokalnymi, a backend Spring Boot odpowiadał za konta, komunikację, synchronizację oraz przechowywanie zaszyfrowanych danych.
Projekt objął również wdrożenie w Dockerze, relacyjne bazy danych, testy integracyjne, dokumentację oraz prototyp klienta webowego w Svelte.
03
Architektura
Najważniejszą decyzją było rozdzielenie odpowiedzialności klienta i serwera. Operacje na wrażliwej zawartości sejfu odbywały się po stronie klienta, natomiast backend przechowywał zaszyfrowane dane i obsługiwał elementy infrastrukturalne.
Na Androidzie interfejs Jetpack Compose został oddzielony od lokalnego stanu, bazy danych, biometrii i komunikacji sieciowej. Serwer wykorzystywał Spring Boot, Hibernate i relacyjną bazę danych, a konteneryzacja upraszczała uruchomienie całego środowiska.
Aplikacja Android
Klient webowy
REST API
Serwer LibrePass
Zaszyfrowane dane
04
Aplikacje klienckie
Aplikacja na Androida była najbardziej kompletną częścią systemu. Obejmowała tworzenie konta i logowanie, dodawanie oraz przeglądanie wpisów, generator haseł, dostęp biometryczny, automatyczne blokowanie i pracę offline.
Klient webowy w Svelte miał udostępnić ten sam sejf na większych ekranach. Pozostał prototypem, który sprawdził kierunek interfejsu przeglądarkowego, ale nie był prezentowany jako ukończony produkt.


05
Synchronizacja
Lokalna baza umożliwiała korzystanie z sejfu bez internetu, ale przenosiła część złożoności na synchronizację. Klient musiał rozróżniać dane dostępne lokalnie od stanu serwera i przewidywalnie reagować na przerwane połączenia oraz zmiany oczekujące na wysłanie.
Projekt pokazał mi, że synchronizacja jest częścią zachowania produktu: wpływa na model danych, komunikaty interfejsu, obsługę błędów i decyzje dotyczące konfliktów między urządzeniami.
Lokalny sejf
Zmiany oczekujące
Serwer LibrePass
Zaszyfrowany payload
06
Bezpieczeństwo
LibrePass łączył szyfrowanie end-to-end z hashowaniem haseł użytkowników, obsługą tokenów, walidacją, ograniczaniem liczby zapytań, biometrią i automatycznym blokowaniem sejfu. Mechanizmy uzupełniały się na różnych warstwach zamiast opierać ochronę na jednym elemencie.
Projekt nie przeszedł niezależnego audytu i nie jest przedstawiany jako produkcyjny menedżer haseł. Stanowi zapis praktycznej nauki modelowania zagrożeń, wyznaczania granic zaufania i pracy z wrażliwymi danymi.
Granica zaufania klienta
Dane jawne tylko na urządzeniu
E2E
Infrastruktura bez treści sejfu
Zaszyfrowany payload
07
Wyzwania
Największym wyzwaniem było utrzymanie spójności interfejsu mobilnego, lokalnego stanu, szyfrowania, uwierzytelniania, synchronizacji i API. Każda decyzja w jednej warstwie wpływała na pozostałe — na przykład model offline determinował sposób przechowywania danych i zachowanie klienta podczas problemów z siecią.
Równoległy rozwój aplikacji Android, backendu, wdrożenia, dokumentacji i klienta webowego pokazał też koszt utrzymywania wielu części produktu przez jedną osobę. Zarchiwizowanie projektu pozwoliło zachować go jako uczciwie opisany projekt referencyjny.
Czego nauczył mnie projekt
Najważniejsze wnioski
LibrePass wymagał jednoczesnego myślenia o interfejsie, szyfrowaniu, synchronizacji, backendzie, wdrożeniu i realnym zakresie projektu.
Bezpieczeństwo jest procesem
Bezpieczeństwo menedżera haseł wynika z połączenia szyfrowania, hashowania haseł, obsługi tokenów, walidacji, blokowania sejfu i jasno określonych granic zaufania.
Synchronizacja jest częścią produktu
Tryb offline i synchronizacja wielu urządzeń muszą zachowywać się przewidywalnie przy braku internetu, oczekujących zmianach lokalnych i równoczesnej edycji danych.
Aplikacja mobilna potrzebuje architektury
Klient Android nauczył mnie oddzielania interfejsu Compose, stanu lokalnego, biometrii, bazy danych i synchronizacji od warstwy prezentacji.
Backend potrzebuje jasnych granic
Serwer odpowiadał za uwierzytelnianie, API, limity zapytań i przechowywanie zaszyfrowanych danych, natomiast operacje na sejfie pozostawały po stronie klienta.
Kod i kontekst
Zajrzyj do repozytoriów projektu
Kod źródłowy, dokumentacja i historia rozwoju LibrePass pozostają publiczne jako materiał referencyjny.
