// projekat ·
Desktop aplikacija za upravljanje lozinkama
Napravio sam lokalnu aplikaciju za lozinke da naučim osnove desktop bezbednosti. Stack: JavaFX, MySQL, JUnit.
Uloga: Lični projekat · Godina: 2023 - 2024 · Status: arhivirano
ukratko: JavaFX desktop menadžer lozinki napravljen da naučim kako se pravilno rukuje kredencijalima. Lozinka za prijavu se hešira BCrypt-om. Sačuvane lozinke sajtova šifruju se AES-256-GCM-om ključem izvedenim iz lozinke za prijavu, pa ih baza nikad ne drži u čistom tekstu.
Problem
Menadžer lozinki ima dve vrste tajni i traže suprotan tretman. Lozinka za prijavu se samo proverava, nikad se ne čita nazad. Sačuvane lozinke sajtova moraju kasnije da se prikažu i kopiraju. Ako sve heširaš, trezor je beskoristan. Ako sve šifruješ ključem koji stoji pored podataka, baza je jedina brava.
Ograničenja
- Više korisnika, jedna MySQL baza. Ko ima samo bazu, ne sme da pročita tuđe sačuvane lozinke.
- Ključ ne sme da se čuva. Mora da dolazi iz nečega što zna samo korisnik.
- Postojeći redovi. Unosi sačuvani pre nego što je šifrovanje postojalo i dalje moraju da se učitaju.
- Desktop UI ostaje responzivan dok čeka bazu.
Odluke
- BCrypt za lozinku za prijavu, preko implementacije iz Spring Security-ja. Proverava se pri prijavi i nikad se ne dešifruje.
- AES-256-GCM za unose u trezoru. Svaka vrednost dobija nasumičan IV od 12 bajtova, a GCM tag otkriva izmene.
- PBKDF2-HMAC-SHA256 sa 120.000 iteracija izvodi ključ trezora iz lozinke za prijavu. Ključ postoji samo u memoriji.
- Verzionisan šifrat. Šifrovane vrednosti počinju sa
v1:, pa se stariji nešifrovani redovi prepoznaju pri učitavanju i šifruju pri sledećem snimanju. - MVC sa DAO slojem i HikariCP-om, i
CompletableFutureoko prijave da JavaFX nit nikad ne čeka MySQL. - Sitnice za upotrebljivost: Jsoup preuzima favicon svakog sajta, lozinke su maskirane dok ih ne otkriješ, a kredencijali mogu da se kopiraju bez prikazivanja.
Ishod
Sačuvane lozinke u ukradenom dump-u baze su nečitljive bez vlasnikove lozinke za prijavu. JUnit i Mockito pokrivaju skladište korisnika i prijavu. Postoji jedna slabost koju bih prvu popravio: PBKDF2 salt je korisničko ime, a ono je predvidivo. Nasumičan salt po korisniku, sačuvan pored BCrypt heša, rešio bi to.