TOTP 與 HOTP:認識一次性密碼標準

TOTP 和 HOTP 均能為雙重認證產生一次性驗證碼,但運作原理各有不同。了解兩者的分別,有助你選擇合適的工具,並明白驗證碼有時失效的原因。

TOTP vs HOTP one-time password comparison diagram
1一次性密碼基礎

什麼是一次性密碼?它為何存在?

一次性密碼(OTP)是只能用於單次身份驗證的代碼。與普通密碼不同,OTP 每次使用時即時生成,使用後立即失效。這意味著即使攻擊者透過網絡釣魚、惡意軟件或網絡監聽截獲了 OTP,也無法將其重複用於第二次登錄。

OTP 的挑戰在於同步:你(客戶端)和伺服器必須在不透過網絡傳輸驗證碼的情況下,獨立產生相同的代碼。解決方案是在登記時建立共享密鑰,再結合雙方均可獨立計算的第二個數值。兩種主流 OTP 標準的分別,在於這第二個數值:HOTP 使用每次認證後遞增的計數器,而 TOTP 則使用當前時間 ↗

TOTP 和 HOTP 均為互聯網工程任務組(IETF)發布的開放標準。HOTP 定義於 RFC 4226,TOTP 定義於 RFC 6238。兩者均使用 HMAC-SHA1 作為底層密碼函數,將共享密鑰與計數器或時間值結合以生成 OTP。由於採用開放標準,任何使用這些標準的驗證器應用程式,都可與支援它們的服務互通,無需擔心供應商鎖定問題。

  • 不可重複使用:每個 OTP 只能使用一次——被截獲的驗證碼對後續登錄毫無用處
  • 共享密鑰:登記時建立的隨機密鑰,由應用程式和服務共同儲存
  • 不經網絡傳輸:驗證碼在本地生成——OTP 演算法從不公開密鑰
  • 開放標準:TOTP 和 HOTP 均為 IETF RFC——所有相容實作之間可互通
  • HMAC-SHA1:用於生成驗證碼的底層密碼雜湊函數
  • 6 或 8 位數字:標準 OTP 為 6 位數;部分高安全性實作採用 8 位數
查看雙重認證技術運作原理的完整說明 →
One-time password generation process showing shared secret and output
2HOTP

HOTP:計數器型驗證碼的運作方式

基於 HMAC 的一次性密碼(HOTP)根據遞增計數器生成驗證碼。每次請求新驗證碼時,計數器加一。你的驗證設備和伺服器各自維護自己的計數器副本。生成驗證碼時,設備計算 HMAC-SHA1(密鑰, 計數器),從結果中提取 6 位數字並顯示。當你將驗證碼提交給伺服器時,伺服器以自身計數器值執行相同計算並比對結果。

HOTP 的關鍵特性是驗證碼不會過期。由於驗證碼基於計數器而非時間,生成的驗證碼在使用前始終有效。這意味著你可以生成一個 HOTP 驗證碼,記錄下來,數小時或數天後再使用。這使 HOTP 在沒有可靠時間同步的環境中非常有用——例如長時間離線工作的專用硬件令牌——但也意味著如果你生成了驗證碼卻未使用(例如不小心按下硬件令牌上的按鈕),計數器可能會失去同步。

HOTP 主要見於較舊的專用硬件令牌,而非現代智能手機驗證器應用程式。YubiKey 的 OTP 模式(有別於其 FIDO2 模式)採用基於計數器的方式。HOTP 也是部分舊式企業認證系統的基礎。對於大多數使用現代驗證器應用程式和網站的香港消費者而言,幾乎不會直接接觸到 HOTP——在消費者認證領域,TOTP 已有效取代它。了解 HOTP 主要與管理舊式認證基礎設施的 IT 專業人員相關。

  • 基於計數器:每次生成驗證碼,客戶端和伺服器的計數器均遞增
  • 無過期限制:HOTP 驗證碼在使用前持續有效——適用於離線硬件令牌
  • 計數器偏移:生成驗證碼而不使用,會導致客戶端與伺服器計數器不同步
  • 前瞻窗口:伺服器接受一定範圍內未來計數器值的驗證碼,以處理偏移問題
  • 使用場景:舊式企業硬件令牌、部分 YubiKey 模式、舊系統
  • 安全注意:被截獲但未使用的 HOTP 驗證碼,可能在合法用戶使用前被攻擊者利用
了解硬件密鑰如何使用密碼學進行身份驗證 →
HOTP counter-based OTP system diagram
3TOTP

TOTP:時間型驗證碼的運作方式及其勝出原因

時間型一次性密碼(TOTP)在 HOTP 基礎上,以當前 Unix 時間戳除以 30 秒間隔取代計數器。計算方式由 HMAC-SHA1(密鑰, 計數器) 改為 HMAC-SHA1(密鑰, floor(時間/30))。這意味著驗證碼每 30 秒自動更新,無需用戶操作,只要驗證器應用程式和伺服器的時鐘保持合理同步,雙方即可獨立計算當前有效的驗證碼。

30 秒窗口是安全性與易用性之間的務實平衡。較短的窗口雖能提供略高的安全性,但因輸入和網絡延遲導致的認證失敗會過於頻繁。較長的窗口則使驗證碼更易被預測,並在更長時間內面臨截獲攻擊的風險。大多數 TOTP 實作接受當前窗口及緊接其前的驗證碼,為輸入較慢的用戶和高延遲連接提供約 60 秒的容差。

TOTP 在消費者雙重認證領域佔主導地位,因為它兼顧了良好的安全性與出色的易用性。驗證碼自動更新,無計數器同步問題,30 秒過期意味著被截獲的驗證碼很快失效。所有主流驗證器應用程式(Google Authenticator、Authy、Microsoft Authenticator、Raivo)均實作 TOTP。所有主流服務(Google、Microsoft、Facebook、Twitter、GitHub)均支援透過標準二維碼設置流程登記 TOTP。對於香港用戶而言,透過驗證器應用程式使用 TOTP 是絕大多數雙重認證使用場景的實用建議。

  • 基於時間:計數器以當前 Unix 時間戳除以 30 秒為單位取代
  • 自動輪換:無需用戶操作,驗證碼每 30 秒自動更新
  • 需要時鐘同步:設備與伺服器時鐘必須在彼此約 30 秒以內
  • 接受窗口:大多數伺服器接受當前及緊接其前的驗證碼(±30 秒)
  • 短暫有效期:30 秒過期使被截獲的驗證碼迅速失效
  • 普遍支援:所有主流驗證器應用程式和服務均實作標準 TOTP
比較最適合香港用戶的 TOTP 驗證器應用程式 →
TOTP 30-second rotating code generation explained
4如何選擇

TOTP 與 HOTP:應選哪一種?

對於幾乎所有消費者使用場景,TOTP 是正確選擇,也是你預設會遇到的標準。當你在任何主流網站的雙重認證設置過程中掃描二維碼,並使用 Google Authenticator、Authy 或任何標準驗證器應用程式時,你使用的正是 TOTP。你無需主動做出選擇——二維碼已編碼了使用哪種標準,而應用程式兩者均支援。預設情況下,無一例外地使用 TOTP。

HOTP 主要在兩種情境下才有意義:一是在 TOTP 廣泛普及之前的舊式企業硬件令牌系統,二是為無法可靠進行時間同步的環境設計的特定硬件設備(如深空研究設施、孤立工業網絡)。對於普通香港用戶而言,你很可能永遠不需要主動選擇 HOTP——如果你正在配置一個預設使用 HOTP 的系統,幾乎總有選項可切換至 TOTP。

從安全性比較的角度來看,在大多數實際使用場景中,TOTP 通常被認為比 HOTP 更安全。HOTP 不過期的驗證碼創造了一個窗口,使攻擊者有機會在合法用戶之前使用被截獲的驗證碼——尤其在驗證碼被提前生成或記錄下來的情況下。TOTP 的 30 秒過期緊密關閉了這個窗口。兩者均遠比短訊驗證碼安全,但在防釣魚能力方面,兩者均不及 FIDO2 硬件安全密鑰。相比選擇 TOTP 還是 HOTP,選擇任何 OTP 方式而非短訊雙重認證更為重要。

  • 使用 TOTP:所有主流消費者服務和現代驗證器應用程式的預設選擇
  • HOTP 使用場景:舊式企業硬件令牌及離線工業系統
  • 安全性比較:TOTP 因自動 30 秒過期,安全性略勝一籌
  • 並非真正的選擇:服務指定支援哪種標準——你只需遵從其要求
  • 兩者均優於短訊:任何 OTP 標準均比短訊雙重認證安全得多
  • 升級路徑:TOTP → 硬件密鑰(FIDO2)以獲得最高防釣魚能力
了解防釣魚多重認證如何超越 TOTP →
Choosing between TOTP and HOTP for your 2FA setup

準備好在你的帳戶上設置 TOTP 了嗎?

了解 TOTP 的運作原理後,選擇你的驗證器應用程式,開始用時間型驗證碼保護你的帳戶吧。

Related VPN Articles