Keamanan adalah prioritas utama dalam setiap sistem login. Meskipun password sudah terenkripsi dengan baik, ancaman seperti phishing, keylogger, dan pencurian password tetap bisa terjadi. Untuk menambah lapisan keamanan, banyak sistem modern seperti Google, Facebook, dan layanan keuangan menggunakan autentikasi dua faktor (2FA).
Dengan fitur autentikasi dua faktor, pengguna tidak hanya memasukkan username dan password, tetapi juga harus memverifikasi identitas melalui kode OTP (One Time Password) yang dikirim ke email atau dihasilkan oleh aplikasi seperti Google Authenticator. Ini membuat akun tetap aman meskipun password bocor ke pihak lain.
Apa Itu Autentikasi Dua Faktor (2FA)?
Autentikasi dua faktor adalah mekanisme keamanan yang meminta dua bukti identitas pengguna sebelum login berhasil.
Biasanya terdiri dari:
-
Sesuatu yang kamu tahu → misalnya password.
-
Sesuatu yang kamu miliki → seperti kode OTP dari email atau aplikasi autentikasi.
Dengan begitu, meskipun seseorang mengetahui password kamu, mereka tetap tidak bisa login tanpa kode OTP yang valid.
Metode Umum 2FA
Ada beberapa cara menerapkan autentikasi dua faktor di PHP, namun dua yang paling populer adalah:
-
OTP melalui Email (Email-based 2FA)
-
Saat login berhasil, sistem mengirim kode OTP ke email pengguna.
-
Pengguna harus memasukkan kode OTP untuk melanjutkan ke dashboard.
-
Kelebihan: mudah diimplementasikan.
-
Kekurangan: bergantung pada kecepatan pengiriman email.
-
-
Google Authenticator (Time-based One-Time Password – TOTP)
-
Menggunakan library seperti
PHPGangsta/GoogleAuthenticatoruntuk membuat kode berbasis waktu (6 digit) yang berubah setiap 30 detik. -
Pengguna memindai QR Code saat setup pertama, lalu menggunakan aplikasinya setiap login.
-
Kelebihan: tidak tergantung koneksi internet/email.
-
Kekurangan: setup awal agak lebih teknis bagi pengguna awam.
-
Struktur Database Sederhana
Misalnya tabel users seperti berikut:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(100) UNIQUE, password VARCHAR(255), otp_secret VARCHAR(64) DEFAULT NULL, otp_code VARCHAR(6) DEFAULT NULL, otp_expiry DATETIME DEFAULT NULL );
Field otp_secret digunakan untuk menyimpan secret key Google Authenticator, sedangkan otp_code dan otp_expiry digunakan untuk OTP Email.
Implementasi OTP Email
Generate OTP & Simpan ke Database
$otp = rand(100000, 999999);
$expiry = date("Y-m-d H:i:s", strtotime("+5 minutes"));
mysqli_query($conn, "UPDATE users SET otp_code='$otp', otp_expiry='$expiry' WHERE email='$email'");
Kirim OTP dengan PHPMailer
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
$mail->setFrom('no-reply@webmu.com', 'WebMu');
$mail->addAddress($email);
$mail->Subject = 'Kode OTP Login Kamu';
$mail->Body = "Kode OTP kamu adalah: <b>$otp</b> (berlaku 5 menit)";
$mail->isHTML(true);
$mail->send();
Verifikasi OTP
$sql = "SELECT * FROM users WHERE email='$email' AND otp_code='$otp' AND otp_expiry > NOW()";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo "Login berhasil!";
} else {
echo "Kode OTP salah atau sudah kadaluarsa.";
}
Implementasi Google Authenticator
Gunakan library open source seperti PHPGangsta/GoogleAuthenticator (bisa diinstal lewat Composer).
composer require sonata-project/google-authenticator
Setup Awal (Generate Secret & QR Code)
$g = new PHPGangsta_GoogleAuthenticator();
$secret = $g->createSecret();
$qrcode = $g->getQRCodeGoogleUrl('WebMu', $secret);
echo "<img src='$qrcode'><br>Secret: $secret";
Verifikasi Kode Saat Login
$checkResult = $g->verifyCode($secret, $_POST['otp'], 2); // toleransi 2*30 detik
if ($checkResult) {
echo "Login sukses!";
} else {
echo "Kode OTP tidak valid.";
}
Tips Keamanan Tambahan
-
Simpan OTP dalam format hash jika memungkinkan (gunakan
password_hash()agar tidak bisa ditebak). -
Batasi percobaan OTP maksimal (misalnya 3 kali).
-
Hapus atau kosongkan OTP setelah digunakan.
-
Jangan tampilkan error yang terlalu spesifik (misalnya “email tidak ditemukan” → ganti dengan “kombinasi salah”).
Kesimpulan
Menerapkan autentikasi dua faktor di PHP menambah lapisan keamanan yang signifikan untuk sistem login. Baik menggunakan OTP Email maupun Google Authenticator, keduanya bisa digabung dengan mudah dalam sistem yang sudah ada.
Langkah kecil seperti ini bisa mencegah kebocoran data, penyalahgunaan akun, dan menjaga kepercayaan pengguna terhadap platform yang kamu kembangkan.