Keamanan

Keamanan, terus terang

MyFina adalah buku rumah tangga. Data keuangan itu istimewa — kami tunjukkan cara melindunginya, tanpa bualan marketing.

Tiga jawaban singkat untuk pertanyaan besar

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.

Di mana disimpan

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.

Bagaimana dihapus

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

Autentikasi

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.

Enkripsi «at rest»

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.

Isolasi data pengguna

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.

Sesi & revocation

JWT dengan `session_version` yang naik. Perubahan password, pemblokiran akun, atau perubahan peran membatalkan semua sesi aktif. Refresh token Mobile-API dirotasi setiap refresh.

GDPR & privasi

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.

Audit & observability

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

  • Kami tidak menjual atau membagikan data Anda ke pihak ketiga. Sumber pendapatan kami adalah langganan Pro, bukan iklan.
  • Kami tidak menjalankan web analytics atau tracker di halaman pengguna — tanpa Google Analytics, Mixpanel, Hotjar.
  • Kami tidak menyimpan password dalam teks polos — bcrypt 12 ronde, tanpa backdoor-recovery.
  • Kami tidak menyematkan saldo atau transaksi Anda di situs mitra — tanpa widget, tidak ada yang bisa bocor.

Sinkronisasi bank — apa yang sebenarnya dibagikan

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.

Yang bisa Anda verifikasi sendiri

Setiap klaim di atas dapat diaudit lewat kode dan API.

  • Enkripsi: src/lib/crypto.ts (AES-256-GCM, randomBytes IV, auth tag).
  • Autentikasi: src/auth.ts, src/lib/auth/rate-limit.ts.
  • Otorisasi: src/lib/auth/ownership.ts (assertCanAccessAccount).
  • Open API: https://app.my-fina.com/api/openapi (OpenAPI 3.1).
  • Health endpoint: https://app.my-fina.com/api/health (liveness publik).

Dapatkan pemberitahuan keamanan

Berlangganan untuk mendengar tentang CVE, patch keamanan, dan perubahan model ancaman. Tanpa marketing.

Beri tahu saya saat Pro tersedia

Satu email. Tanpa spam. Berhenti berlangganan sekali klik.

Patuh GDPR · data diproses di UETerakhir diperbarui: 3 Juni 2026