Oskar Karpiński
Wróć do projektów
Projekt open source

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.

Prototyp aplikacji webowej LibrePass z widokiem sejfu haseł
Szczegóły wpisu z hasłem w aplikacji LibrePass

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

Synchronizacja po odzyskaniu sieci

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

Szyfrowany transport

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.

01

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.

Szyfrowanie E2EUwierzytelnianieWalidacja
02

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.

Offline-firstSynchronizacjaObsługa konfliktów
03

Aplikacja mobilna potrzebuje architektury

Klient Android nauczył mnie oddzielania interfejsu Compose, stanu lokalnego, biometrii, bazy danych i synchronizacji od warstwy prezentacji.

Jetpack ComposeMaterial 3Biometria
04

Backend potrzebuje jasnych granic

Serwer odpowiadał za uwierzytelnianie, API, limity zapytań i przechowywanie zaszyfrowanych danych, natomiast operacje na sejfie pozostawały po stronie klienta.

Spring BootREST APIModel danych

Kod i kontekst

Zajrzyj do repozytoriów projektu

Kod źródłowy, dokumentacja i historia rozwoju LibrePass pozostają publiczne jako materiał referencyjny.