Lokki adalah aplikasi password manager berbasis desktop yang berjalan sepenuhnya lokal. Semua data disimpan di mesin pengguna dan tidak ada panggilan jaringan sama sekali. Aplikasi ini dikembangkan menggunakan Java Swing dengan arsitektur MVC dan MySQL sebagai basis data.
- Enkripsi envelope: vault key 256-bit melindungi semua credential
- Setup master password dengan indikator kekuatan password real-time
- Login dengan percobaan terbatas (3x) dan cooldown 5 detik
- Recovery key 24 karakter untuk pemulihan akses
- CRUD credential (site name, URL, username, password, kategori, catatan)
- Pencarian dan filter credential berdasarkan kategori
- Password generator dengan opsi karakter (upper, lower, digit, symbol)
- Copy username/password ke clipboard dengan auto-clear 30 detik
- Auto-lock setelah 5 menit tidak ada aktivitas
- Password strength bar dengan 4 level (Weak/Medium/Strong/Very Strong)
- Tampilkan/sembunyikan password pada field input
| Komponen | Teknologi |
|---|---|
| Bahasa | Java 17 |
| GUI | Java Swing (Nimbus Look and Feel) |
| Database | MySQL 8.x |
| Konektor DB | mysql-connector-j 8.3.0 |
| Build Tool | Maven 3.8+ |
| Kriptografi | javax.crypto (standar library Java, tanpa pustaka pihak ketiga) |
- Java 17 atau lebih tinggi
- MySQL 8.x berjalan secara lokal
- Maven 3.8+ (atau gunakan
mvnw.cmdyang sudah disediakan)
Aplikasi akan otomatis membuat database lokki_db dan seluruh tabel saat pertama kali dijalankan. Tidak perlu menjalankan file SQL secara manual.
Buka file src/main/java/com/lokki/dao/DatabaseManager.java. Ubah nilai konstanta berikut sesuai konfigurasi MySQL anda:
private static final String USER = "root";
private static final String PASSWORD = "";Default menggunakan user root tanpa password. Jika MySQL anda menggunakan user/password berbeda, ubah di sini.
mvnw compile
mvnw exec:javaAtau jika Maven sudah terinstall secara global:
mvn compile
mvn exec:javaSaat pertama kali dijalankan, aplikasi akan mendeteksi bahwa vault belum di-setup dan menampilkan halaman setup. Anda akan diminta membuat master password, kemudian aplikasi akan menampilkan recovery key satu kali. Simpan recovery key tersebut di tempat aman.
Tidak ingin repot install MySQL, Java, atau Maven? Gunakan Lokki_app - SQLite + Java runtime sudah dibundle. Cukup download, extract, dan jalankan.
| Aspek | Versi Utama | Standalone (Lokki_app) |
|---|---|---|
| Database | MySQL 8.x | SQLite (file lokki.db) |
| Runtime | Perlu Java 17+ | Sudah termasuk Java runtime |
| Build | Perlu Maven | Langsung pakai .exe / .bat |
| File DB | Di MySQL server | lokki.db di folder aplikasi |
- Download
Lokki_app.zipdari halaman Releases - Extract ke folder mana saja
- Jalankan
Lokki_app.exe(atauLokki_app.batjika SmartScreen muncul) - Database
lokki.dbdibuat otomatis saat setup pertama
Kedua versi menggunakan format enkripsi dan skema vault yang identik. Data dapat dipindahkan antar versi dengan migrasi manual tabel master_config dan credentials.
lokki/
pom.xml
mvnw.cmd
src/main/java/com/lokki/
model/ -- POJO classes (Credential, MasterConfig, Category)
dao/ -- Akses database (DatabaseManager, MasterConfigDAO, CredentialDAO, CategoryDAO)
service/ -- Logika bisnis (Auth, Vault, Encryption, KeyDerivation, PasswordGenerator, RecoveryKey)
controller/ -- Penghubung view dan service (AuthController, VaultController)
view/ -- GUI (LoginFrame, SetupFrame, MainFrame, RecoveryFrame, AddEditCredentialDialog, PasswordGeneratorDialog)
view/component/ -- Komponen GUI kustom (CredentialTableModel, PasswordStrengthBar, ClipboardTimer)
util/ -- Utility (SecureMemoryUtil, RecoveryKeyFormatter)
src/main/resources/
db/schema.sql -- Referensi skema database
Aplikasi menggunakan arsitektur MVC dengan 4 layer yang ketat:
View (Swing frames dan dialog)
|
Controller (menghubungkan input ke service, memperbarui view)
|
Service (logika bisnis, enkripsi, manajemen key)
|
DAO (query SQL saja, tidak ada logika)
|
MySQL (database lokal)
Aturan:
- View tidak boleh mengakses DAO secara langsung
- DAO tidak boleh mengakses Service
- Controller adalah satu-satunya kelas yang mengimpor dari package View dan Service
Lokki menggunakan skema enkripsi envelope:
- Vault Key (256-bit) dibuat secara acak saat setup menggunakan SecureRandom
- Vault Key digunakan untuk mengenkripsi semua password credential (AES-256-GCM)
- Vault Key sendiri disimpan dalam database dalam dua bentuk terenkripsi:
- Dienkripsi oleh key turunan dari master password
- Dienkripsi oleh key turunan dari recovery key
- Vault Key hanya berada di memori selama sesi aktif
- Algoritma: PBKDF2WithHmacSHA256
- Iterasi: 310.000 (rekomendasi OWASP 2023)
- Panjang key: 256 bit
- Panjang salt: 128 bit (16 byte), dibuat dengan SecureRandom
- Algoritma: AES-256-GCM
- IV: 12 byte, dibuat baru setiap enkripsi
- Format penyimpanan: base64(IV + ciphertext + GCM_tag)
- GCM memberikan kerahasiaan dan integritas data
- 24 karakter acak dari charset A-Z dan 2-9 (tanpa 0, O, 1, I, L)
- Format tampilan: XXXX-XXXX-XXXX-XXXX-XXXX-XXXX
- Ditampilkan SATU KALI saat setup
- Tidak pernah disimpan oleh aplikasi
- Semua input password menggunakan char[], bukan String
- char[] dihapus (diisi null) segera setelah tidak diperlukan
- Dilakukan di dalam blok finally untuk menjamin eksekusi
- Vault key byte[] dihapus saat aplikasi ditutup atau auto-lock
Menyimpan satu baris konfigurasi vault.
| Kolom | Tipe | Keterangan |
|---|---|---|
| id | INT (PK) | Auto increment |
| password_hash | VARCHAR(512) | Hash PBKDF2 untuk verifikasi login |
| salt_master | VARCHAR(128) | Salt untuk derivasi key dari master password |
| salt_recovery | VARCHAR(128) | Salt untuk derivasi key dari recovery key |
| encrypted_vault_key_by_master | TEXT | Vault key dienkripsi dengan key turunan master |
| encrypted_vault_key_by_recovery | TEXT | Vault key dienkripsi dengan key turunan recovery |
Kategori untuk mengorganisir credential. Default: General, Social, Work, Finance, Developer.
Menyimpan data login. Hanya kolom encrypted_password yang dienkripsi.
| Kolom | Tipe | Keterangan |
|---|---|---|
| site_name | VARCHAR(255) | Nama situs (plaintext) |
| site_url | VARCHAR(500) | URL situs (plaintext) |
| username | VARCHAR(255) | Username (plaintext) |
| encrypted_password | TEXT | Password dienkripsi AES-256-GCM (base64) |
| category_id | INT | Foreign key ke categories |
| notes | TEXT | Catatan (plaintext, beri label peringatan di UI) |
- User memasukkan master password di SetupFrame
- AuthService membuat vault key 32 byte acak
- Key turunan dibuat dari master password menggunakan PBKDF2
- Recovery key 24 karakter dibuat
- Key turunan dibuat dari recovery key menggunakan PBKDF2
- Vault key dienkripsi dengan kedua key turunan
- Semua data disimpan ke tabel master_config
- Recovery key ditampilkan ke user (hanya sekali)
- User memasukkan master password di LoginFrame
- AuthService membaca konfigurasi dari master_config
- Key diturunkan dari input password menggunakan salt yang tersimpan
- Hash password diverifikasi
- Jika cocok, vault key didekripsi
- Vault key digunakan untuk sesi aktif
- User memasukkan recovery key dan master password baru
- AuthService membaca konfigurasi dari master_config
- Key diturunkan dari recovery key
- Vault key didekripsi menggunakan recovery derived key
- Master password baru diproses untuk menghasilkan key turunan baru
- Vault key dienkripsi ulang dengan key turunan yang baru
- Data master_config diperbarui
Credential.java- POJO untuk data loginMasterConfig.java- POJO untuk konfigurasi vaultCategory.java- POJO untuk kategori
DatabaseManager.java- Mengelola koneksi JDBC dan inisialisasi databaseMasterConfigDAO.java- CRUD tabel master_configCredentialDAO.java- CRUD tabel credentialsCategoryDAO.java- Query tabel categories
AuthService.java- Setup vault, login, logout, recoveryVaultService.java- CRUD credential dengan enkripsi/dekripsiEncryptionService.java- Enkripsi/dekripsi AES-256-GCM (static methods)KeyDerivationService.java- Derivasi key PBKDF2 (static methods)PasswordGeneratorService.java- Generator password acakRecoveryKeyService.java- Generator dan formatter recovery key
AuthController.java- Mengelola alur autentikasi (setup/login/recovery)VaultController.java- Mengelola tampilan vault utama
LoginFrame.java- Halaman login (entry point aplikasi)SetupFrame.java- Halaman setup awalRecoveryFrame.java- Halaman pemulihan aksesMainFrame.java- Tampilan utama vaultAddEditCredentialDialog.java- Dialog tambah/edit credentialPasswordGeneratorDialog.java- Dialog generator password
CredentialTableModel.java- Model tabel untuk JTable credentialPasswordStrengthBar.java- Komponen visual indikator kekuatan passwordClipboardTimer.java- Timer countdown penghapusan clipboard
SecureMemoryUtil.java- Utility penghapusan char[] dan byte[]RecoveryKeyFormatter.java- Formatter recovery key (format XXXX-XXXX-XXXX-XXXX-XXXX-XXXX)
- Hanya kolom password yang dienkripsi. Nama situs, URL, username, dan catatan disimpan sebagai plaintext.
- Catatan (notes) menampilkan peringatan "disimpan sebagai plaintext" di UI.
- Aplikasi tidak membuat koneksi internet sama sekali.
- Tidak ada dependensi kriptografi pihak ketiga. Semua menggunakan javax.crypto dan java.security.