Debugger kode TOTP / 2FA

Hasilkan dan debug kode TOTP / 2FA: derivasi RFC 6238 lengkap, verifikasi jendela drift, dan penguraian otpauth:// — semua di peramban Anda.

Waktu

Masukkan rahasia untuk melihat kode.

otpauth:// URI untuk konfigurasi ini
otpauth://totp/user%40example.com?secret=JBSWY3DPEHPK3PXP&algorithm=SHA1&digits=6&period=30

Apa sebenarnya keenam digit itu

Kode TOTP — angka yang digulirkan aplikasi autentikator setiap tiga puluh detik — tidak acak dan tidak disimpan di mana pun. Ia dihitung, baik di ponsel Anda maupun di server, dari dua hal yang sudah sama-sama mereka pegang: rahasia yang disetel sekali saat Anda mengaktifkan autentikasi dua faktor, dan waktu saat ini. Karena kedua sisi bisa menghitungnya secara mandiri, tak ada yang harus berpindah di antara mereka saat Anda masuk; server cukup menjalankan perhitungan yang sama dan memeriksa bahwa jawabannya cocok dengan jawaban Anda.

TOTP (RFC 6238) adalah lapisan tipis di atas skema yang lebih tua, HOTP (RFC 4226). HOTP mengubah rahasia dan penghitung menjadi kode; TOTP hanyalah HOTP dengan penghitung disetel ke jumlah langkah waktu sejak epoch Unix. Itulah seluruh gagasannya: bagi waktu Unix saat ini dengan panjang langkah (30 detik secara default) dan berikan hasilnya ke HOTP. Alat ini menampilkan setiap langkah perhitungan itu, karena ketika kode tak terverifikasi, jawabannya hampir selalu terlihat di suatu tempat dalam derivasi.

Derivasi, langkah demi langkah

Lima langkah membawa rahasia dan waktu ke digit yang Anda ketik. Alat ini mencetak masing-masing agar Anda bisa membandingkan dengan implementasi Anda sendiri:

  • Penghitung. Ambil waktu Unix dalam detik, kurangi T0 (0 di setiap penerapan nyata), bagi dengan periode, dan bulatkan ke bawah. Pada langkah 30 detik, setiap momen dalam setengah menit yang sama memberi penghitung yang sama, itulah sebabnya kode bertahan selama ia bertahan.
  • HMAC. Tulis penghitung sebagai 8 bita big-endian dan hitung HMAC(rahasia, penghitung) dengan hash yang dipilih — SHA-1 untuk hampir setiap autentikator. Ini menghasilkan digest 20 bita untuk SHA-1 (32 untuk SHA-256, 64 untuk SHA-512).
  • Offset. Ambil empat bit rendah dari bita terakhir digest. Itu angka dari 0 sampai 15, dan mengatakan di mana harus membaca dalam digest — pemotongan dinamis, agar rahasia yang sama tak selalu memakai bita yang sama.
  • Nilai 31-bit. Baca empat bita mulai dari offset dan masker bit teratas (untuk menghindari kekeliruan tanda). Tersisa bilangan bulat 31-bit.
  • Kode. Ambil bilangan bulat itu modulo 10^digit dan isi dengan nol di kiri. Enam digit adalah pilihan hampir universal; tujuh dan delapan ada dan diizinkan.

Pemaskeran bit teratas dan modulo adalah satu-satunya langkah yang berkehilangan: banyak digest berbeda memetakan ke enam digit yang sama, dan itu tak apa, karena kode hanya perlu sulit ditebak dalam tiga puluh detik saat ia hidup, bukan unik selamanya.

Mengapa kode tak cocok — tiga penyebab yang biasa

Ketidakcocokan TOTP tak pernah datang dengan pesan galat; kodenya sekadar salah. Dalam praktik hampir selalu satu dari tiga hal, dan panel di sini disusun untuk membedakannya:

  • Rahasia dibaca dalam format yang salah. Rahasia autentikator adalah Base32, tetapi karakter yang sama dibaca sebagai hex — atau rahasia yang sebenarnya hex dibaca sebagai Base32 — menghasilkan bita yang sama sekali berbeda dan kode yang sama sekali berbeda. Alihkan sakelar format dan lihat mana yang memberi kode yang Anda harapkan.
  • Parameter berbeda. Default yang sangat dominan adalah HMAC-SHA-1, 6 digit, periode 30 detik. Server yang memakai SHA-256, atau 8 digit, atau langkah 60 detik, akan tak sepakat dengan aplikasi yang dibiarkan pada default. otpauth:// URI membawa ketiganya, itulah sebabnya memindai QR mendapatkannya dengan benar dan mengetik rahasia dengan tangan sering tidak.
  • Jam menyimpang. TOTP mengasumsikan kedua sisi sepakat tentang waktu. Jika jam ponsel cepat semenit, kodenya semenit di depan kode server. Untuk itulah jendela drift: memverifikasi kode terhadap langkah di kedua sisi waktu sekarang mengatakan bukan hanya apakah ia cocok tetapi seberapa jauh jam menyimpang.

RFC 6238 menyarankan jendela validasi paling banyak satu langkah di tiap sisi — cukup untuk menyerap penyimpangan jam biasa dan kondisi balapan di saat pergantian, tanpa memperlebar ruang tebakan lebih dari perlunya. Alat ini memakai ±1 secara default dan membiarkan Anda memperlebarnya saat men-debug.

Rahasia, Base32, dan otpauth:// URI

Rahasia dibagikan sekali, saat penyiapan, dan segala sesuatu setelahnya diturunkan darinya. Aplikasi autentikator mengodekannya dalam Base32 (RFC 4648) — alfabet A–Z dan 2–7, yang menghindari karakter yang mudah keliru dibaca dan bertahan dicetak di bawah kode QR. Alat ini membaca Base32 secara default, mengabaikan spasi yang ditambahkan aplikasi untuk keterbacaan, serta besar-kecil huruf, dan juga menerima hex agar Anda bisa mereproduksi vektor uji RFC 6238, yang rahasianya diberikan sebagai bita mentah.

Kode QR yang Anda pindai saat penyiapan juga bukan sihir: ia mengodekan otpauth:// URI teks-polos yang membawa rahasia dan semua parameter. Tempel satu di sini untuk mengisi bidang, atau bangun satu dari bidang untuk memindahkan penyiapan antaraplikasi:

otpauth://totp/GitHub:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=GitHub&algorithm=SHA1&digits=6&period=30

Hanya tipe totp yang diterima. Otpauth://hotp URI membawa penghitung alih-alih periode, dan memperlakukannya sebagai TOTP akan diam-diam menghasilkan kode yang salah — jadi ia ditolak alih-alih ditebak.

Algoritme, digit, dan periode

RFC 6238 mengizinkan HMAC-SHA-1, SHA-256, atau SHA-512, enam sampai delapan digit, dan panjang langkah apa pun. Dalam praktik dunia bersepakat pada SHA-1, enam digit, dan tiga puluh detik, dan kebanyakan aplikasi hanya mengimplementasikan kombinasi itu — jadi server yang memilih hal lain harus berharap aplikasi pengguna mengikuti, dan banyak yang tidak. Pilihan yang aman untuk kompatibilitas adalah yang membosankan.

Layak membahas soal SHA-1 secara langsung, karena alat hash di situs ini menandai SHA-1 sebagai rusak. Kedua pernyataan itu benar. SHA-1 tak bisa dipakai untuk tanda tangan digital karena penyerang bisa membuat tumbukan — dua dokumen dengan hash yang sama. TOTP tak bergantung pada sifat itu: keamanannya datang dari kunci rahasia di dalam HMAC, bukan dari ketahanan hash terhadap tumbukan, dan HMAC-SHA-1 tetap kukuh. Memakai SHA-256 di sini bisa dibela tetapi memberi sedikit manfaat, dan menelan kompatibilitas dengan aplikasi yang hanya melakukan SHA-1.

Apa yang dilindungi dan tak dilindungi alat ini

Semua di sini berjalan di peramban Anda. HMAC dihitung dengan Web Crypto API di perangkat Anda sendiri — primitif yang sama yang dipakai alat hash dan HMAC — dan tak ada yang Anda ketik — rahasia, kode, atau otpauth URI — diunggah, disimpan, atau dicatat. Itu adalah sifat dari kode yang berada di sisi klien, bukan janji yang harus Anda percayai.

Meski begitu, rahasia TOTP adalah faktor kedua: siapa pun yang memilikinya bisa menghasilkan kode Anda. Menempel rahasia produksi ke halaman web mana pun — termasuk ini — menaruhnya di papan-klip dan mungkin di riwayat peramban, jadi perlakukan dengan kehati-hatian yang sama seperti kata sandi, dan lebih baik pakai rahasia sekali-pakai atau rahasia uji ketika Anda hanya perlu memahami mekanismenya. Alat ini ada untuk men-debug dan belajar, bukan untuk menjadi tempat faktor kedua asli Anda berada.

Pertanyaan yang sering diajukan

Apakah rahasia saya dikirim ke server?
Tidak. Kode dihitung di peramban Anda dengan Web Crypto API, dan tak ada yang Anda ketik diunggah atau dicatat. Karena rahasia TOTP adalah faktor kedua, tetaplah berhati-hati menempel yang produksi — ia bisa melewati papan-klip dan riwayat peramban seperti teks mana pun.
Mengapa kode saya tak cocok dengan aplikasi autentikator saya?
Hampir selalu satu dari tiga hal: rahasia dibaca dalam format yang salah (Base32 vs hex), parameter berbeda dari default (kebanyakan aplikasi SHA-1, 6 digit, periode 30 detik), atau jam perangkat menyimpang. Panel derivasi mengisolasi dua yang pertama, dan verifikasi dengan jendela drift ± mengungkap yang ketiga.
Apa perbedaan antara TOTP dan HOTP?
HOTP (RFC 4226) menghitung kode dari rahasia dan penghitung yang bertambah tiap pemakaian. TOTP (RFC 6238) adalah konstruksi yang sama dengan penghitung disetel ke jumlah langkah waktu sejak epoch Unix, jadi kode berubah dengan jam alih-alih dengan tekanan tombol. TOTP adalah yang dipakai aplikasi autentikator.
Mengapa SHA-1 menjadi default padahal rusak di tempat lain?
SHA-1 rusak untuk tanda tangan karena tumbukan bisa dibangun, tetapi HMAC — yang menjadi dasar TOTP — tak bergantung pada ketahanan terhadap tumbukan; keamanannya bertumpu pada kunci rahasia. HMAC-SHA-1 kukuh, dan ia satu-satunya algoritme yang diimplementasikan banyak aplikasi autentikator, jadi ia adalah default yang aman sekaligus kompatibel.
Bisakah saya memaku kode ke waktu tertentu?
Ya. Alihkan waktu dari langsung ke dipaku dan masukkan stempel waktu Unix. Kode lalu tetap statis, begitulah cara mereproduksi vektor uji yang diterbitkan — RFC 6238 memberi nilai pada waktu seperti 59 dan 1111111109 — atau memeriksa kode mana yang valid pada momen lampau.
Seberapa besar jendela drift seharusnya?
RFC 6238 menyarankan paling banyak satu langkah di tiap sisi, yang dipakai alat ini secara default. Jendela yang lebih lebar menoleransi jam yang lebih menyimpang tetapi juga memperlebar himpunan kode yang akan diterima server, jadi itu imbangan; ±1 adalah keseimbangan standar.
Untuk apa digit dan periode?
Digit adalah berapa banyak angka dalam kode — enam hampir di mana-mana, tujuh atau delapan di tempat layanan menginginkan sedikit lebih banyak kekuatan. Periode adalah berapa detik kode tetap valid, tiga puluh secara default. Keduanya dibawa dalam otpauth:// URI, dan keduanya harus cocok di kedua sisi atau kode tak akan sepakat.

Alat terkait