Preskoči na sadržaj
nazad na projekte

// projekat ·

Desktop aplikacija za upravljanje lozinkama

Napravio sam lokalnu aplikaciju za lozinke da naučim osnove desktop bezbednosti. Stack: JavaFX, MySQL, JUnit.

JavaFX / MySQL / Jsoup / 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 CompletableFuture oko 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.