跳到主要內容

OTP 一次性密碼完全解析:TOTP、HOTP 與挑戰回應機制如何強化多因子認證安全

什麼是 OTP?三種產生機制一次看懂

OTP(One-Time Password) 是每次認證後即刻失效的動態密碼,從根本上杜絕重放攻擊(Replay Attack)。依產生機制,OTP 分為三類:TOTP(時間同步)HOTP(計數同步)、以及非同步挑戰回應

TOTP(RFC 6238) 以當前 Unix 時間戳為輸入,每 30 秒產生一組新密碼,Google Authenticator 即採此標準。HOTP(RFC 4226) 則以遞增計數器為輸入,密碼不隨時間失效,而是在每次成功驗證後計數器才往前推進,適合離線裝置。非同步挑戰回應由伺服器下發隨機挑戰值(Challenge),用戶端以金鑰運算後回傳,不需要時間或計數同步,安全性最高但實作較複雜。

OTP 如何強化多因子認證(MFA)

MFA 要求使用者同時提供「知識(密碼)」、「持有(裝置)」、「生物特徵」三要素中的兩項以上。OTP 作為「持有」要素,即使靜態密碼遭洩漏,攻擊者仍無法在有效時間窗口內偽造動態碼,顯著降低帳戶接管風險。

TOTP 的核心演算法為 HMAC-SHA1:以共享金鑰(Secret Key)與時間步長(Time Step)作為 HMAC 輸入,再截取 6-8 位數字輸出。伺服器端只需保存同一把 Secret Key,即可離線驗算用戶端提交的 OTP,無需任何網路往返,驗證延遲極低。實際部署時,建議允許前後一個時間步長的容錯(Clock Skew Tolerance),以因應用戶端時鐘偏移。

import pyotp

secret = pyotp.random_base32()          # 產生共享金鑰
totp   = pyotp.TOTP(secret)            # 建立 TOTP 實例
print(totp.now())                      # 取得當前 6 位 OTP
print(totp.verify("123456"))           # 驗證用戶輸入

💡 重點整理

  • TOTP 每 30 秒更新,適合行動裝置 App(如 Google Authenticator)。
  • HOTP 依計數器驅動,適合無時鐘的硬體 Token。
  • 挑戰回應 由伺服器主導,最能抵禦中間人攻擊(MITM)。
  • OTP 作為 MFA 的持有要素,可有效阻擋憑證填充(Credential Stuffing)攻擊。

選擇 OTP 機制時,優先評估裝置是否具備穩定時鐘;有時鐘選 TOTP,無時鐘選 HOTP,高安全場景則採挑戰回應。三者皆能大幅強化帳戶安全,是現代身份驗證架構不可或缺的基石。

留言