Implementasi Autentikasi Dua Faktor (2FA) Berbasis TOTP RFC 6238 Murni Tanpa Library Eksternal
Memahami algoritma Time-Based One-Time Password dan implementasi decoding Base32 serta HMAC-SHA1 menggunakan fungsi bawaan PHP.
Mengamankan akun dengan lapisan verifikasi tambahan kini menjadi standar. Algoritma TOTP yang dipakai aplikasi autentikator bekerja sepenuhnya luring, tanpa memerlukan SMS berbayar maupun layanan pihak ketiga.
Cara kerjanya, langkah demi langkah
Server dan aplikasi autentikator berbagi satu kunci rahasia yang ditukar sekali saat pendaftaran, biasanya melalui kode QR. Setelah itu keduanya tidak pernah berkomunikasi lagi.
Kode dihasilkan dengan membagi stempel waktu Unix dengan interval 30 detik untuk memperoleh penghitung bilangan bulat. Penghitung itu di-hash bersama kunci rahasia menggunakan HMAC-SHA1. Empat bit terakhir hasil hash dipakai sebagai offset untuk memilih empat byte dari hash tersebut, yang kemudian diambil enam digit terakhirnya. Karena kedua pihak menghitung dari waktu yang sama, keduanya sampai pada angka yang sama tanpa pertukaran apa pun.
Base32 dan alasan pemakaiannya
Kunci rahasia dipertukarkan dalam pengodean Base32, bukan Base64 atau heksadesimal. Alasannya praktis: Base32 hanya memakai huruf besar dan angka, menghindari karakter yang mudah tertukar, dan tetap terbaca ketika pengguna harus mengetikkannya secara manual.
Implementasi dekoder Base32 dengan fungsi bawaan cukup lurus — setiap karakter mewakili lima bit, dan bit-bit itu dirangkai lalu dipecah kembali menjadi byte delapan bit. Perhatikan penanganan karakter pengisi dan spasi yang sering disisipkan demi keterbacaan.
Detail yang menentukan keamanannya
Tiga hal sering terlewat. Pertama, toleransi waktu: jam perangkat pengguna dapat meleset, sehingga server sebaiknya menerima satu interval sebelum dan sesudah — lebih dari itu memperlebar peluang tebakan tanpa manfaat berarti.
Kedua, kode yang sudah dipakai harus ditolak pada percobaan berikutnya, karena tanpa itu kode yang tercuri masih berlaku hingga akhir intervalnya. Ketiga, perbandingan kode wajib menggunakan fungsi yang waktunya tetap agar tidak membocorkan informasi melalui selisih waktu respon.
Bagian yang sering dilupakan
Pembatasan percobaan sama pentingnya dengan algoritmanya. Enam digit berarti sejuta kemungkinan; tanpa pembatasan laju, kombinasi itu dapat ditelusuri jauh lebih cepat daripada yang diperkirakan.
Sediakan pula kode pemulihan sekali pakai dan simpan dalam bentuk hash, sama seperti kata sandi. Pengguna yang kehilangan ponsel tanpa jalan pemulihan akan menghubungi dukungan — dan proses pemulihan manual yang lemah sering menjadi titik terlemah dari seluruh sistem yang dibangun dengan susah payah.
Andi Pratama
Kontributor RedaksiSpesialis keamanan siber, ethical hacker, dan analis kerentanan infrastruktur jaringan industri.
Artikel Terkait
Lihat Semua →Observability dengan Anggaran Terbatas: Log Terstruktur, Metrik, dan Jejak Seperlunya
20 Sep 2026
Optimalisasi MySQL 8 di Lingkungan Shared Hosting: Indexing, Buffer Pool, dan Slow Query
07 Sep 2026
Panduan Komprehensif: Mengamankan API RESTful dengan Pembatasan Token Bucket dan APCu
29 Agt 2026
Anatomi AI Image Generation: Dari Difusi Piksel Menuju Flow Matching
17 Okt 2026