⏱️ Kriptografi & Protokol RFC ✓ Analisis Piawaian IETF

TOTP vs HOTP: Perbezaan Asas, Prinsip Operasi dan Keselamatan Kriptografi

Jutaan pembangun dan jurutera keselamatan melihat kod pengesahan 6 digit yang bertukar setiap hari, namun hanya segelintir yang memahami mekanisme matematik elegan yang beroperasi di sebalik skrin. Daripada pembilang didorong peristiwa RFC 4226 (HOTP) pada tahun 2005 hingga langkah masa diskret RFC 6238 (TOTP) pada tahun 2011, panduan ini meneliti algoritma Pemotongan Dinamik (Dynamic Truncation) pada tahap bait, kerentanan penyahsegerakan pembilang, toleransi pelesapan jam, dan mengapa TOTP menakluki web moden.

2FA
Pasukan Keselamatan 2FA-Tool
Dikemas kini Oktober 2026
Anggaran Masa Bacaan: 8 min bacaan (2,600+ patah perkataan)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Pengajaran Kriptografi Utama (TL;DR)
  • Perbezaan Input Asas: HOTP mengira cincangan daripada pembilang yang meningkat secara monoton C, manakala TOTP menggantikan C dengan langkah masa zaman T (CurrentUnixTime / 30).
  • Pewarisan Langsung: TOTP secara matematik adalah pengkhususan daripada HOTP: TOTP(K, Time) = HOTP(K, T). Kedua-dua algoritma menggunakan fungsi Pemotongan Dinamik (Dynamic Truncation) yang sama persis.
  • Faktor Penentu Seni Bina: HOTP berkeadaan (stateful - pelayan mesti mengunci dan mengekalkan pembilang ke cakera pada setiap pengesahan). TOTP tanpa keadaan (stateless), membolehkan perkhidmatan mikro awan moden mengesahkan token merentas kluster seimbang beban teragih tanpa operasi penulisan pangkalan data berpusat.
01

Akar Sejarah: Daripada Token Perkakasan Hak Milik ke Piawaian Web Terbuka

Pada awal tahun 2000-an, pengesahan dua faktor korporat didominasi oleh peranti perkakasan proprietari seperti RSA SecurID. Peranti tertutup dan mahal ini mengandungi kristal kuarza dalaman yang disegerakkan ke pelayan perusahaan proprietari. Jika sesebuah organisasi ingin menyediakan keselamatan pelbagai faktor kepada beribu-ribu pekerja, kos perolehan perkakasan dan lesen proprietari adalah sangat membebankan.

Untuk membebaskan pengesahan daripada vendor proprietari, konsortium OATH (Initiative for Open Authentication) ditubuhkan oleh para peneraju industri untuk menyampaikan piawaian IETF terbuka dan bebas royalti yang boleh diperiksa, dilaksanakan, dan diaudit secara bebas oleh mana-mana jurutera perisian:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Disesuaikan untuk mikropengawal berkuasa rendah dengan butang tolak fizikal. Menekan butang akan meningkatkan pembilang dalaman dan mencetak token 6 digit ke skrin LCD.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Direka bentuk seiring dengan lonjakan penggunaan telefon pintar. Dengan memanfaatkan penyegerakan masa rangkaian NTP selular, TOTP menghapuskan ketidakpadanan keadaan butang fizikal sepenuhnya.

02

Seni Bina HOTP (RFC 4226) & Mekanik Bait Pemotongan Dinamik

Definisi matematik teras HOTP sangat ringkas dan berkesan:

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C)) mod 10DigitCount

Pecahan Parameter:

  • K: Kunci rahsia simetri yang dikongsi (biasanya jujukan binari 160-bit / 20-bait yang dinyahkod daripada Base32).
  • C: Pembilang integer 8-bait (64-bit) berformat big-endian.
  • HMAC-SHA-1: Kod pengesahan mesej cincangan berkunci yang menghasilkan ringkasan kriptografi 20-bait (160-bit).

🔍 Bagaimana Pemotongan Dinamik (DT) Menukar 20 Bait kepada 6 Digit:

Ringkasan HMAC-SHA1 mengandungi 160 bit (20 bait). Mengekstrak 6 digit perpuluhan seragam memerlukan mekanisme pemilihan berketentuan dan tahan perlanggaran yang ditakrifkan dalam Seksyen 5.3 RFC 4226:

// Langkah 1: Kira Ofset Dinamik
Offset = HS[19] & 0x0F
Ambil bait terakhir (indeks 19) bagi ringkasan 20-bait. Melakukan operasi topeng dengan 0x0F mengasingkan 4 bit tertib rendah, menghasilkan integer yang berada tepat antara 0 dan 15 (0x0 hingga 0xF). Ini memastikan pengekstrakan 4 bait seterusnya tidak sekali-kali melebihi penimbal 20-bait (kerana 15 + 4 = 19).
// Langkah 2: Ekstrak 4 Bait Berturutan dengan Penopengan
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Ekstrak 4 bait bermula pada Offset. Topeng 0x7F menetapkan bit paling bererti (MSB) kepada sifar untuk mengelakkan limpahan integer bertanda merentas pelbagai seni bina CPU (memastikan integer 31-bit positif yang bersih).
// Langkah 3: Aritmetik Modulo untuk Digit Akhir
OTP = P mod 106 = P mod 1000000
Penggunaan modulo 1,000,000 mengasingkan 6 digit perpuluhan terakhir, dengan penambahan sifar di hadapan jika diperlukan (contohnya 748 menjadi "000748").
🧪 Vektor Ujian Konkrit daripada Lampiran D RFC 4226:

Katakan kunci rahsia ialah ASCII "12345678901234567890" dan Pembilang C = 0. Ringkasan HMAC-SHA1 yang terhasil dalam heksadesimal ialah:

cc 93 cf 18 50 8d 94 93 4c 64 b6 6d 8b fb 87 fb 23 cb 4b 71

1. Bait terakhir ialah 0x71. 0x71 & 0x0F = 0x01, maka Offset = 1.
2. Bait 1 hingga 4 ialah: 93 cf 18 50. Menetapkan MSB kepada sifar menghasilkan 0x13cf1850, yang bersamaan dengan nilai perpuluhan 332,339,280.
3. 332339280 mod 1000000 = 339280. OTP 6 digit yang terhasil ialah 339280!

03

Evolusi TOTP (RFC 6238): Keajaiban Langkah Masa

HOTP memerlukan pembilang pada klien sentiasa disegerakkan dengan pelayan. Pada peranti perisian, mengira tekanan kekunci atau butang memperkenalkan kesilapan manusia secara berterusan.

RFC 6238 menggantikan pembilang C dengan langkah masa diskret T yang diperoleh terus daripada jam Unix epoch:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Saat yang telah berlalu sejak 1970-01-01 00:00:00 UTC.
  • T0: Rujukan permulaan epoch (lalai kepada 0 dalam semua pelaksanaan moden).
  • X (Tetingkap Langkah Masa): Tempoh standard yang disyorkan iaitu 30 saat.
  • Fungsi Lantai ⌊ ⌋: Untuk sebarang cap waktu dalam tetingkap 30 saat, T kekal tidak berubah. Sebagai contoh, antara saat epoch 1728211200 dan 1728211229, nilai T menilai kepada integer 64-bit yang sama persis.

Pensirilan Binari: Sebaik sahaja T dikira, ia dibungkus ke dalam penimbal bait binari 8-bait big-endian (serupa dari segi struktur memori dengan pembilang C dalam HOTP). Oleh yang demikian, formula bersatu dipermudahkan kepada:
TOTP(K, Time) = HOTP(K, T) Keanggunan matematik ini menerangkan sebab aplikasi pengesah memperbaharui token secara serentak setiap 30 saat tanpa memerlukan penyegerakan keadaan berterusan.

Sokongan RFC 6238 untuk SHA-256 dan SHA-512: Walaupun RFC 4226 mentakrifkan HMAC-SHA-1 secara ketat, RFC 6238 memperluas sokongan untuk HMAC-SHA-256 dan HMAC-SHA-512. Dalam SHA-256 (ringkasan 32-bait), ofset diambil daripada bait 31 (HS[31] & 0x0F); dalam SHA-512 (ringkasan 64-bait), ofset diambil daripada bait 63 (HS[63] & 0x0F). Walau bagaimanapun, dalam 99.9% laman web komersial (Google, Microsoft, GitHub, AWS), SHA-1 kekal sebagai piawaian lalai sejagat kerana keserasian klien mudah alih warisan.
04

Matriks Perbandingan Komprehensif Bersebelahan (HOTP vs. TOTP)

Dimensi HOTP (RFC 4226) TOTP (RFC 6238)
Pemboleh Ubah Input Pembilang Peristiwa C (meningkat secara monoton) Langkah Masa T (tetingkap 30 saat Unix epoch)
Jangka Hayat Token Tidak terhad (sah sehingga digunakan oleh log masuk seterusnya) Ketat 30 saat (batal secara automatik)
Seni Bina Pelayan Berkeadaan (memerlukan penulisan pangkalan data atomik setiap log masuk) Tanpa keadaan (pengesahan NTP bebas)
Pendedahan Serangan Ulang Tayang Sederhana (token yang dipintas kekal sah sehingga digunakan) Minimum (terhad kepada baki saat dalam tetingkap semasa)
Mod Kegagalan Utama Penyahsegerakan Pembilang (tekanan butang tidak sengaja) Pelesapan Jam (sisihan masa telefon klien)
Cincangan Kriptografi Disokong HMAC-SHA-1 eksklusif HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Penerimaan Industri Token perbankan legasi, pintu keselamatan fizikal khusus 99.9% pengesah web moden
05

Penyahsegerakan vs Pelesapan Masa: Mitigasi Teknikal

Dalam persekitaran pengeluaran teragih, jam klien dan pelayan tidak dapat dielakkan daripada mengalami sisihan. Ahli kriptografi mereka bentuk tetingkap pampasan eksplisit untuk mengekalkan kebolehpercayaan:

⚙️ Mitigasi HOTP: Tetingkap Pengesahan Pandang Hadapan (s)

Jika pengguna mengklik butang token mereka sebanyak 5 kali tanpa menghantar, pembilang klien mencapai C+5 manakala pelayan kekal pada C.
RFC 4226 menetapkan bahawa semasa pengesahan, pelayan mengira tetingkap pandang hadapan yang merangkumi [C+1, C+s] (biasanya s=20). Jika padanan berlaku, pelayan melompat ke hadapan dan menyegerakkan pembilang C serta-merta.

⏱️ Mitigasi TOTP: Toleransi Sisihan Masa (Tetingkap ±1)

Disebabkan oleh kependaman rangkaian atau pelesapan jam peranti klien (contohnya jam telefon terlambat 10 saat), token mungkin tiba dalam langkah masa bersebelahan.
Pelayan pengeluaran menilai tatasusunan 3 tetingkap: [T-1, T, T+1], yang secara praktikal memperluaskan tetingkap penerimaan kepada 90 saat.

Peraturan Wajib Anti-Ulang Tayang: Untuk mengelakkan serangan ulang tayang dalam tetingkap sisihan 90 saat, pelayan mesti menyimpan dan mengunci token yang telah digunakan dalam memori (cth. Redis) selama 90 saat, lalu menolak penghantaran pendua.
🛡️ Perbandingan Rentetan Masa Malar (Pertahanan Serangan Pemasaan):

Apabila pelayan mengesahkan sama ada kod yang dihantar pengguna sepadan dengan kod yang dikira, semakan kesaksamaan rentetan lazim (seperti userOtp === serverOtp) tamat serta-merta pada aksara pertama yang tidak sepadan. Penyerang yang mengukur masa tindak balas pusing balik rangkaian mikroskopik boleh menyusun semula digit secara lelaran. Bahagian belakang perusahaan menguatkuasakan perbandingan kesaksamaan masa malar (cth., crypto.timingSafeEqual dalam Node.js) untuk mematahkan analisis saluran sisi pemasaan.

06

Mengapa TOTP Memenangi Internet Moden

Kemenangan mutlak TOTP ke atas HOTP di seluruh web didorong oleh tiga keperluan asas seni bina:

☁️ Kebolehskalaan Awan Tanpa Keadaan

Dalam perkhidmatan mikro teragih merentas berbilang wilayah, mana-mana kejadian pelayan dengan jam yang disegerakkan NTP boleh mengesahkan token TOTP tanpa perlu menyoal atau mengunci rekod pangkalan data berpusat.

📱 Sinergi Ekosistem Mudah Alih

Telefon pintar secara berterusan menentukur jam sistem mereka melalui stesen pangkalan selular dan GPS, menghapuskan isu pelesapan jam tanpa memerlukan penyelenggaraan perkakasan fizikal.

🛡️ Tetingkap Serangan Sempit 30 Saat

Token HOTP kekal sah selama-lamanya sehingga digunakan. Token TOTP luput dalam masa 30 saat, meneutralkan log yang terjejas dan tangkapan paket pasif secara automatik.

🧮 Enjin RFC 6238 Tulen Bahagian Klien

Alami Pengiraan TOTP Masa Nyata dalam 2FA-Tool

Saksikan bagaimana rentetan rahsia Base32 anda berubah menjadi kod dinamik 6 digit melalui pemotongan dinamik HMAC-SHA1. 100% luar talian dalam pelayar anda.

Buka Penjana Dalam Talian