Perlindungan Ganda dengan Sandi Berputar 30 Detik
Mengunci akun dengan kode 6 angka acak dari aplikasi autentikator yang disimpan dengan enkripsi tingkat tinggi agar terhindar dari kebocoran akun.
Mengunci akun dengan kode 6 angka acak dari aplikasi autentikator yang disimpan dengan enkripsi tingkat tinggi agar terhindar dari kebocoran akun.
Tantangan & Kebutuhan Pengguna
Banyak aplikasi mengimplementasikan TOTP menggunakan paket npm pihak ketiga yang sudah tidak terawat dan menyimpan secret TOTP dalam bentuk plaintext Base32 di database. Jika terjadi kebocoran baca pada tabel pengguna (misalnya melalui backup yang bocor), penyerang dapat langsung mengkloning aplikasi autentikator seluruh pengguna. Selain itu, perbandingan kode OTP menggunakan operator string biasa (`===`) rentan terhadap serangan timing side-channel.
Secret MFA di dalam database harus diperlakukan sama sensitifnya dengan kunci privat: wajib dienkripsi secara autentik dengan IV unik, dan kode pemulihan hanya boleh disimpan dalam bentuk hash satu arah.
Solusi & Cara Kerja
Seluruh mesin TOTP dibangun dari nol di `common/utils/totp.ts` sesuai spesifikasi RFC 4226 (HOTP) dan RFC 6238 (TOTP) dengan secret 160-bit. Saat pengguna memulai aktivasi MFA, secret dienkripsi dengan algoritma `aes-256-gcm` menggunakan IV acak 12-byte dan authentication tag, lalu disimpan sementara di dalam tiket cookie HttpOnly berumur pendek (`mfa-setup`). Secret baru ditulis ke database hanya setelah pengguna berhasil memverifikasi kode 6 digit pertama. Sepuluh kode pemulihan (recovery codes) di-generate secara kriptografis, di-hash dengan SHA-256 ber-prefix salt, dan langsung dihapus satu per satu dalam transaksi atomik saat digunakan.
Berikut adalah implementasi verifikasi TOTP tahan timing-attack serta enkripsi autentik AES-256-GCM dari `common/utils/totp.ts`:
Detail & Hal yang Diperhatikan
- Toleransi Clock Skew: Fungsi `verifyTotp` menggunakan jendela `window = 1` (±30 detik) untuk mengakomodasi selisih jam antara smartphone pengguna dan server.
- Timing-Safe Verification: Baik verifikasi kode TOTP 6 digit maupun pencocokan hash recovery code wajib melewati `crypto.timingSafeEqual` untuk menutup celah timing attack.
- Dual-Axis Brute Force Protection: Tabel `mfa_attempts` membatasi percobaan gagal berdasarkan kombinasi `userUuid` dan `ip` secara bersamaan sebelum mengizinkan dekripsi secret.
- Global Super Admin Enforcement: Variabel lingkungan `ENFORCE_SUPER_ADMIN_MFA=true` secara otomatis memaksa akun Super Admin mengaktifkan MFA sebelum dapat mengakses halaman atau aksi dashboard apa pun.