Terbaru & Terpercaya
Tutorial

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.

Andi Pratama
Andi Pratama
• • 2 menit baca
Bagikan:
GTechUpdate Tech Banner
Foto: GTechUpdate Tech Banner

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.

Tag Terkait: #PHP
Andi Pratama

Andi Pratama

Kontributor Redaksi

Spesialis keamanan siber, ethical hacker, dan analis kerentanan infrastruktur jaringan industri.

Artikel Terkait

Lihat Semua →