Tutorial Membangun Sistem QR Code Dinamis untuk Validasi Keamanan (TOTP)
Tutorial Membangun Sistem QR Code Dinamis untuk Validasi Keamanan (TOTP)
Bayangkan Anda membuat sistem tiket acara atau sistem absensi karyawan menggunakan QR Code. Solusi paling sederhana adalah: buatkan satu teks ID unik (misal: USER-12345), jadikan QR code, dan minta scanner untuk memverifikasinya ke database.
Masalahnya: QR Code statis seperti ini sangat mudah dipalsukan! Seseorang bisa memfoto (screenshot) tiket tersebut dan membagikannya ke 10 temannya. Sistem di pintu masuk tidak akan tahu mana yang asli.
Solusinya? QR Code Dinamis yang selalu berubah setiap 30 detik. Konsep ini persis seperti yang digunakan oleh aplikasi perbankan, GoPay/OVO (saat *scan to pay*), atau Google Authenticator.
Konsep Dasar: TOTP (Time-based One-Time Password)
Sistem QR yang berubah-ubah tidak memerlukan koneksi internet secara terus-menerus di sisi pengguna (aplikasi yang menampilkan QR). Rahasianya terletak pada algoritma TOTP.
Berikut adalah logika cara kerjanya:
- Secret Key (Kunci Rahasia): Saat pengguna mendaftar atau membeli tiket, server membuat sebuah Secret Key acak (misal:
JBSWY3DPEHPK3PXP). Kunci ini disimpan di database server dan juga diberikan ke aplikasi pengguna secara diam-diam. - Waktu (Timestamp): Kedua sisi (HP Pengguna dan Server) harus memiliki sinkronisasi jam/waktu yang sama.
- Proses Hashing: Setiap 30 detik, aplikasi di HP pengguna akan menggabungkan
Secret Key+Waktu Saat Inilalu mengenkripsinya (HMAC-SHA1) menjadi 6 digit angka unik atau token panjang. - Generate QR: Token unik ini lah yang dicetak menjadi gambar QR Code di layar HP.
Alur Validasi di Lapangan
Sekarang, mari kita lihat apa yang terjadi saat QR Code tersebut di-scan oleh petugas tiket:
- Petugas men-scan QR dan mendapatkan token (contoh:
849302beserta ID User). - Alat scanner mengirim data ini ke server.
- Server melihat ID User, mencari Secret Key-nya di database.
- Server melakukan hitungan matematika yang persis sama:
Secret Key User + Waktu Server Saat Ini. - Jika hasilnya cocok dengan token dari scanner (
849302), maka akses diizinkan!
Karena waktu terus berjalan, token 849302 akan kadaluarsa dan otomatis tertolak jika ada yang menggunakan screenshot tersebut 1 menit kemudian.
Contoh Implementasi Konsep (Python)
Berikut adalah kerangka logika dasarnya jika kita menggunakan Python dan library pyotp:
import pyotp
import time
# 1. Server membuat Secret Key untuk User A
user_secret = pyotp.random_base32()
print("Secret Key User A:", user_secret)
# 2. HP User meng-generate token saat ini (Lalu dijadikan QR Code)
totp = pyotp.TOTP(user_secret)
current_token = totp.now()
print("Token di QR Code sekarang:", current_token)
# --- Anggap waktu berlalu ---
print("Menunggu 30 detik...")
# time.sleep(30) # Jika ini dijalankan, token awal akan kadaluarsa
# 3. Server memvalidasi token dari Scanner
# Server membandingkan token dari QR dengan kalkulasi server
is_valid = totp.verify(current_token)
if is_valid:
print("Validasi Sukses! Tiket Asli.")
else:
print("Validasi Gagal! Tiket palsu/kadaluarsa.")
Teknik Tambahan untuk Skala Produksi (Agar 100% Tidak Bisa Dipalsukan)
Meskipun TOTP menyelesaikan masalah screenshot (karena gambar statis akan kadaluarsa dalam 30 detik), para pemalsu tiket sering kali beralih ke cara lain: Screen Recording (Merekam Layar). Seseorang bisa merekam layar HP-nya selama 1 menit, mengirim videonya ke temannya, dan temannya tinggal menyetel video tersebut di depan scanner.
Untuk mencegah pemalsuan tingkat lanjut ini, ada beberapa teknik wajib:
- Animasi Detik Berjalan (Visual Indicator): Tambahkan garis waktu berjalan (*progress bar*) atau jarum jam bergerak yang sangat halus di sekitar QR Code. Jika penjaga tiket melihat ada loncatan frame (karena video diulang), mereka tahu itu rekaman.
- Animasi Interaktif (Anti-Video): Ini teknik yang dipakai oleh banyak aplikasi tiket konser. Pengguna diinstruksikan untuk menyentuh layar, dan akan muncul efek riak air (*ripple*) atau logo yang bergerak mengikuti jari di latar belakang QR Code. Penjaga bisa meminta pengguna menggeser jarinya untuk membuktikan itu aplikasi asli, bukan video.
- Kriptografi Asimetris (JWT/Digital Signature): Jangan hanya menaruh ID di dalam QR. Gunakan token JWT yang ditandatangani menggunakan *Private Key* rahasia server. Meskipun seseorang tahu struktur datanya, mereka tidak bisa menciptakan QR Code baru yang valid karena tidak memiliki kunci kriptografinya.
- Validasi Satu Kali (Single-Use per Token): Pastikan database menyimpan riwayat pemakaian token. Jika token `849302` sudah di-scan sedetik yang lalu, meskipun masih dalam jendela waktu 30 detik, percobaan scan kedua dengan token yang sama harus langsung Ditolak.
Kesimpulan
Membangun QR Code dinamis adalah langkah pertama yang sangat solid untuk mencegah pembajakan tiket atau *fraud* absensi via *screenshot*. Dengan mengkombinasikan algoritma TOTP, perlindungan cryptographic signature, dan elemen UI anti-rekam-layar, Anda menciptakan benteng validasi yang secara teknis hampir mustahil ditembus oleh calo atau pelaku kecurangan.