Mengapa Kode TOTP Gagal Saat Jam Perangkat Bergeser
Kode adalah hash dari rahasia dan langkah waktu saat ini. Bandingkan selisihnya di kedua ujung, lalu perbaiki jam alih-alih memperlebar jendela.
Kode sekali pakai bisa sepenuhnya benar di ponsel Anda dan tetap ditolak server pada detik yang sama. Kedua sisi menghitung fungsi yang sama dari rahasia bersama dan langkah waktu saat ini, jadi ketidaksepakatan soal waktu menghasilkan ketidaksepakatan soal kode. Itu menjadikan pergeseran jam sebagai cacat yang relevan bagi keamanan, bukan sekadar gangguan.
Ada dua jam yang penting di sini, dan memperbaiki yang terlihat adalah bagian yang orang lakukan lebih dulu. Yang biasanya perlu diperhatikan adalah yang lain.
Kode adalah fungsi waktu, bukan kata sandi
TOTP mengambil rahasia bersama dan penghitung yang diturunkan dari waktu saat ini, melewatkan keduanya melalui hash berkunci dan memotong hasilnya menjadi string desimal pendek, sebagaimana ditentukan dalam RFC 6238. Penghitung maju pada setiap langkah waktu, biasanya tiga puluh detik, sehingga rahasia yang sama menghasilkan nilai baru ketika langkah berubah. Verifikator menghitung ulang nilai yang diharapkan untuk langkah saat ini dan membandingkannya, yang memerlukan rahasia yang sama dan gagasan yang sama tentang sekarang. Kata sandi tetap dapat dipakai ulang sampai diubah, sedangkan nilai ini kedaluwarsa pada batas yang tidak dapat dilihat klien.
Itulah sebabnya satu kode berfungsi dan kode berikutnya gagal beberapa saat kemudian. Ini juga menjelaskan mengapa menyalin kode dari pesan obrolan adalah kebiasaan yang begitu tidak andal.
Dua jam harus sepakat, bukan satu
Materi pendaftaran adalah hal bersama yang pertama, dan waktu adalah yang kedua. Jika rahasianya benar sementara jamnya berbeda lebih dari jendela yang ditoleransi, setiap nilai yang dihasilkan jatuh pada langkah yang salah dan ditolak. Jika jamnya sepakat sementara rahasianya salah, setiap nilai juga ditolak, dan kedua kegagalan tampak identik dari layar masuk. Memisahkan keduanya berarti memeriksa entri akun dan waktu secara terpisah, dalam urutan itu.
Jam verifikator layak mendapat pemeriksaan yang sama dengan jam perangkat. Server yang sumber waktunya rusak menolak kode benar dari semua pengguna sekaligus, dan laporan akan menggambarkan pemadaman mendadak alih-alih pergeseran. Pola itu layak dikenali, karena perbaikannya ada di server dan bukan di seratus ponsel.
Berapa biaya memperlebar jendela
Implementasi dapat menerima kode dari langkah yang berdekatan untuk menyerap perbedaan kecil, dan toleransi itu adalah keputusan desain, bukan penyesuaian gratis. Setiap langkah tambahan melipatgandakan jumlah nilai yang valid pada setiap saat, yang persis itulah yang disukai penyerang yang menebak. Aturan anti-ulang penting karena alasan yang sama, karena kode yang diterima dua kali adalah kode yang bocor secara berguna. Administrator yang memperlebar jendela untuk membungkam keluhan menukar properti nyata dengan perbaikan kosmetik.
Memperbaiki jam adalah perbaikannya, sedangkan memperlebar jendela adalah obat penenang. Yang pertama menghapus penyebabnya dan yang kedua menyembunyikannya.
Periksa kedua jam sebelum mencoba lagi
Baca waktu di perangkat dan di server, lalu bandingkan selisihnya, bukan waktu lokal yang ditampilkan. Perintah di bawah ini menunjukkan status sinkronisasi dan momen UTC mentah pada host atau server Linux. Jalankan di kedua ujung sebelum mengubah pengaturan autentikasi apa pun.
timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status
Selisih yang diukur dalam detik tidak berbahaya, yang diukur dalam menit menjelaskan penolakan, dan sistem yang tidak melaporkan sumber sinkronisasi apa pun adalah kandidat untuk keduanya. Bandingkan kedua stempel waktu UTC secara langsung, karena waktu lokal mencakup zona waktu yang tidak pernah dilihat algoritme. Jika selisihnya kecil dan kode masih gagal, berhentilah menyetel jam dan periksa entri pendaftaran sebagai gantinya. Upaya berulang terhadap akun yang terkunci membuat cacat awal lebih sulit diamati.
Catat waktu penolakan, selisih, dan teks kesalahan, lalu jauhkan rahasia bersama dari catatan itu. Dukungan dapat bekerja dengan tiga yang pertama dan tidak boleh pernah melihat yang keempat.