Bagaimana dienkripsi
TLS 1.3 saat transit (Let's Encrypt). Kunci API eksternal, token bank, dan rahasia broker — AES-256-GCM dengan IV unik per record. Password — bcrypt (12 ronde). Kunci enkripsi tinggal di env, bukan di database.
Keamanan
MyFina adalah buku rumah tangga. Data keuangan itu istimewa — kami tunjukkan cara melindunginya, tanpa bualan marketing.
Tiga jawaban singkat untuk pertanyaan besar
TLS 1.3 saat transit (Let's Encrypt). Kunci API eksternal, token bank, dan rahasia broker — AES-256-GCM dengan IV unik per record. Password — bcrypt (12 ronde). Kunci enkripsi tinggal di env, bukan di database.
PostgreSQL 16 di instance managed pada Hetzner (Jerman, UE). Jaringan Docker terisolasi, tanpa koneksi eksternal ke DB. Backup — harian, dienkripsi sebelum diunggah, retensi 30 hari.
Hard-delete akun dalam satu langkah: transaksi, akun, kategori, mata uang, token dihapus secara cascade. Tidak ada tabel soft-delete, tidak ada arsip «untuk berjaga-jaga». Marketing lead dengan email yang sama — erase-hook terpisah (GDPR Pasal 17).
Enam pilar pertahanan
NextAuth.js v5 di atas JWT, password di-hash dengan bcrypt. Login throttling — 5 percobaan / 15 menit per identifier dan 20 / 15 menit per IP. OAuth Google opsional. Reset password pakai token 32-byte; hanya SHA-256-nya yang disimpan.
Kunci API eksternal (bank, Resend, Anthropic) dan rahasia broker dienkripsi dengan AES-256-GCM. Kunci tidak pernah meninggalkan server. Setiap koneksi bank membawa webhook secret hex 32-byte per koneksi.
Setiap UPDATE/DELETE memfilter berdasarkan `userId`. Proteksi IDOR dipusatkan di `assertCanAccessAccount/Category` — akses ke akun pengguna lain mengembalikan 403, bukan 404. Akun keluarga bersama memakai peran eksplisit OWNER/MEMBER/VIEWER.
JWT dengan `session_version` yang naik. Perubahan password, pemblokiran akun, atau perubahan peran membatalkan semua sesi aktif. Refresh token Mobile-API dirotasi setiap refresh.
Hard-delete akun menghapus semua transaksi, akun, dan kategori secara cascade dalam satu transaksi. Ekspor data — CSV/XLSX/PDF dengan satu klik. Cookie consent dengan dua kategori (essential / functional), tanpa analytics, tanpa tracker.
Semua aksi admin dan operasi pengguna sensitif ditulis ke `audit_log` dengan IP, user-agent, dan source. Log percobaan login disimpan 30 hari. Event webhook Stripe duduk di journal idempotency tersendiri untuk replay aman saat gagal.
Yang TIDAK kami lakukan
Jika Anda menghubungkan Monobank atau bank PSD2 lewat GoCardless, kami hanya menerima yang diperlukan untuk sinkronisasi transaksi: pembayaran keluar, transfer masuk, saldo akun. Tanpa data pribadi sisi bank (paspor, foto, biometrik). Token API bank disimpan terenkripsi dengan AES-256-GCM; Anda dapat mencabut akses dengan satu klik dari Pengaturan → Bank. Persetujuan GoCardless berakhir setiap 90 hari sesuai PSD2 — kami mengingatkan 7 hari sebelumnya.
Detail lebih dalam
Daftar lengkap layanan pihak ketiga yang memproses data Anda: Hetzner (hosting), Stripe (penagihan), Resend (email), Anthropic (AI, DRAFT), GoCardless (PSD2), Monobank API, FCM.
Buka daftarMatriks per-fitur: apa yang disimpan, berapa lama, bagaimana dihapus. Alur GDPR Pasal 15/17/20 dan jendela retensi per entitas.
Buka matriksYang bisa Anda verifikasi sendiri
Setiap klaim di atas dapat diaudit lewat kode dan API.
src/lib/crypto.ts (AES-256-GCM, randomBytes IV, auth tag).src/auth.ts, src/lib/auth/rate-limit.ts.src/lib/auth/ownership.ts (assertCanAccessAccount).https://app.my-fina.com/api/openapi (OpenAPI 3.1).https://app.my-fina.com/api/health (liveness publik).Berlangganan untuk mendengar tentang CVE, patch keamanan, dan perubahan model ancaman. Tanpa marketing.