TOTP 和 HOTP 均能為雙重認證產生一次性驗證碼,但運作原理各有不同。了解兩者的分別,有助你選擇合適的工具,並明白驗證碼有時失效的原因。
一次性密碼(OTP)是只能用於單次身份驗證的代碼。與普通密碼不同,OTP 每次使用時即時生成,使用後立即失效。這意味著即使攻擊者透過網絡釣魚、惡意軟件或網絡監聽截獲了 OTP,也無法將其重複用於第二次登錄。
OTP 的挑戰在於同步:你(客戶端)和伺服器必須在不透過網絡傳輸驗證碼的情況下,獨立產生相同的代碼。解決方案是在登記時建立共享密鑰,再結合雙方均可獨立計算的第二個數值。兩種主流 OTP 標準的分別,在於這第二個數值:HOTP 使用每次認證後遞增的計數器,而 TOTP 則使用當前時間 ↗。
TOTP 和 HOTP 均為互聯網工程任務組(IETF)發布的開放標準。HOTP 定義於 RFC 4226,TOTP 定義於 RFC 6238。兩者均使用 HMAC-SHA1 作為底層密碼函數,將共享密鑰與計數器或時間值結合以生成 OTP。由於採用開放標準,任何使用這些標準的驗證器應用程式,都可與支援它們的服務互通,無需擔心供應商鎖定問題。
基於 HMAC 的一次性密碼(HOTP)根據遞增計數器生成驗證碼。每次請求新驗證碼時,計數器加一。你的驗證設備和伺服器各自維護自己的計數器副本。生成驗證碼時,設備計算 HMAC-SHA1(密鑰, 計數器),從結果中提取 6 位數字並顯示。當你將驗證碼提交給伺服器時,伺服器以自身計數器值執行相同計算並比對結果。
HOTP 的關鍵特性是驗證碼不會過期。由於驗證碼基於計數器而非時間,生成的驗證碼在使用前始終有效。這意味著你可以生成一個 HOTP 驗證碼,記錄下來,數小時或數天後再使用。這使 HOTP 在沒有可靠時間同步的環境中非常有用——例如長時間離線工作的專用硬件令牌——但也意味著如果你生成了驗證碼卻未使用(例如不小心按下硬件令牌上的按鈕),計數器可能會失去同步。
HOTP 主要見於較舊的專用硬件令牌,而非現代智能手機驗證器應用程式。YubiKey 的 OTP 模式(有別於其 FIDO2 模式)採用基於計數器的方式。HOTP 也是部分舊式企業認證系統的基礎。對於大多數使用現代驗證器應用程式和網站的香港消費者而言,幾乎不會直接接觸到 HOTP——在消費者認證領域,TOTP 已有效取代它。了解 HOTP 主要與管理舊式認證基礎設施的 IT 專業人員相關。
時間型一次性密碼(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 是絕大多數雙重認證使用場景的實用建議。
對於幾乎所有消費者使用場景,TOTP 是正確選擇,也是你預設會遇到的標準。當你在任何主流網站的雙重認證設置過程中掃描二維碼,並使用 Google Authenticator、Authy 或任何標準驗證器應用程式時,你使用的正是 TOTP。你無需主動做出選擇——二維碼已編碼了使用哪種標準,而應用程式兩者均支援。預設情況下,無一例外地使用 TOTP。
HOTP 主要在兩種情境下才有意義:一是在 TOTP 廣泛普及之前的舊式企業硬件令牌系統,二是為無法可靠進行時間同步的環境設計的特定硬件設備(如深空研究設施、孤立工業網絡)。對於普通香港用戶而言,你很可能永遠不需要主動選擇 HOTP——如果你正在配置一個預設使用 HOTP 的系統,幾乎總有選項可切換至 TOTP。
從安全性比較的角度來看,在大多數實際使用場景中,TOTP 通常被認為比 HOTP 更安全。HOTP 不過期的驗證碼創造了一個窗口,使攻擊者有機會在合法用戶之前使用被截獲的驗證碼——尤其在驗證碼被提前生成或記錄下來的情況下。TOTP 的 30 秒過期緊密關閉了這個窗口。兩者均遠比短訊驗證碼安全,但在防釣魚能力方面,兩者均不及 FIDO2 硬件安全密鑰。相比選擇 TOTP 還是 HOTP,選擇任何 OTP 方式而非短訊雙重認證更為重要。