首頁

什麼是 TOTP?

TOTP 是許多 Authenticator 應用程式和帳號安全系統使用的基於時間的一次性密碼方案。本指南說明 2FA、MFA、OTP、Base32 設定金鑰、otpauth 連結、演算法、位數和常見 30 秒刷新週期這些概念。

TOTP 是什麼意思

TOTP 是 time-based one-time password,也就是基於時間的一次性密碼。它透過共享設定金鑰和目前時間產生一組短數字驗證碼,因此驗證碼會隨著時間推進而變化。

TOTP 驗證碼如何產生

TOTP 產生器會解碼設定金鑰,把目前 Unix 時間切分成時間步,使用 SHA-1、SHA-256 或 SHA-512 等 HMAC 演算法計算,再截斷成指定長度的數字驗證碼。

RFC 6238 公式和時間步計數器

RFC 6238 把計數器定義為 T = floor((UnixTime - T0) / X)。使用常見的 T0=0 和 30 秒時間步 X 時,服務端與 Authenticator 會各自把 T 編碼為 8 位元組大端計數器,再透過同一個共享金鑰 K 計算 HMAC。K、T0、X、演算法和驗證碼位數全部一致時,同一時間步會得到相同驗證碼。

動態截斷和前導零

TOTP 使用的 HOTP 步驟會取 HMAC 最後一個位元組的低 4 位作為偏移量,從該位置讀取 4 個位元組並清除最高符號位,得到 31 位正整數,再對 10^digits 取模。結果不足指定長度時在左側補零,因此 6 位驗證碼完全可能以 0 開頭。

時鐘準確性和驗證視窗

登入前,Authenticator 和服務端不會互相傳送目前驗證碼,而是分別透過各自時鐘計算。服務端可以接受相鄰的少量時間步來容忍一般時鐘偏差,但每多接受一個視窗都會延長截獲驗證碼可能有效的時間,因此驗證視窗應保持較小。

為什麼時區不會改變 TOTP

公式使用 Unix 時間,而不是介面顯示的本地時區。只修改時區標籤通常不會改變 TOTP 驗證碼,但系統時鐘本身不準確會讓計數器落入其他時間步,導致正確設定金鑰產生的驗證碼被拒絕。

TOTP 的安全限制和網路釣魚風險

TOTP 在密碼之外增加一個獨立因素,但它不具備抗網路釣魚性。攻擊者可以即時轉送目前驗證碼,取得共享設定金鑰的人也能計算後續驗證碼。請保護設定金鑰和恢復碼、確認登入網站來源;如果服務支援抗網路釣魚驗證,優先考慮 Passkey 或硬體安全金鑰。

TOTP、OTP、2FA 和 MFA 的關係

OTP 是一次性密碼的總稱,TOTP 是基於時間的 OTP。2FA 表示雙因素驗證,MFA 表示多因素驗證。TOTP 驗證碼經常作為 2FA 或 MFA 中的一個驗證因素。

Base32 設定金鑰

手動設定 Authenticator 時看到的金鑰通常是 Base32 格式,字元範圍是 A-Z 和 2-7,也可能帶空格便於閱讀。空格只是顯示格式,實際計算會使用規範化後的金鑰位元組。

otpauth 連結和 QR code

很多 QR code 內部包含 otpauth://totp/ URI。這個連結可以攜帶帳號標籤、issuer、secret、algorithm、digits 和 period,讓相容的 Authenticator 工具準確設定產生器。

瀏覽器本機產生

本站可以透過 Base32 secret 或 otpauth URI 在瀏覽器本機產生 Authenticator 風格的 TOTP 驗證碼。URL 快捷填入推薦使用 #secret=YOUR_BASE32_SECRET 這種 fragment 形式,因為 fragment 不會隨 HTTP 請求傳送。

TOTP 演算法參數速查

標準 TOTP 驗證碼會把共享 secret 和時間步計數器結合,再透過 HMAC 與動態截斷得到數字驗證碼。這個表格整理 Authenticator 應用程式最常見的參數。

參數在 TOTP 中的作用常見值
共享 secret / Base32 設定金鑰服務和 Authenticator 共同保存的私密值,用來產生每一次驗證碼。必填
時間步長 / 週期每個驗證碼視窗的長度,通常由 Unix 時間除以週期得到計數器。30 秒
HMAC 演算法動態截斷之前使用的雜湊演算法。SHA-1
驗證碼位數取模後顯示的數字長度。6 位
issuer 和帳號標籤otpauth URI 裡的顯示資訊,不改變 TOTP 計算結果。可選

標準與參考資料

常見問題

TOTP 和 2FA 驗證碼是同一個東西嗎?

不完全是。TOTP 是產生 OTP 的一種方法。很多服務把 TOTP 驗證碼作為 2FA 的第二個因素,所以使用者通常會把產生出來的 TOTP 值稱為 2FA 驗證碼。

為什麼 TOTP 驗證碼通常 30 秒變化一次?

TOTP 演算法使用時間步,30 秒是常見預設值。時間步更短會更不寬容,時間步更長則代表每個驗證碼有效時間更久。

沒有設定金鑰可以產生 TOTP 驗證碼嗎?

不可以。有效的 TOTP 驗證碼需要共享設定金鑰,以及匹配的 period、algorithm、digits 等參數。沒有 secret 就無法計算正確驗證碼。

TOTP 快捷 URL 哪種格式更安全?

推薦使用 #secret=YOUR_BASE32_SECRET 這種 fragment 快捷方式。fragment 留在瀏覽器中,不會像 path 或 query 一樣傳送到伺服器。

裝置時區會影響 TOTP 驗證碼嗎?

不會。TOTP 使用 Unix 時間,不使用介面顯示的時區標籤。但裝置時鐘仍需準確,因為過快或過慢的時鐘可能選擇錯誤的時間步計數器。

Base32 是 TOTP 計算的一部分嗎?

Base32 是設定共享金鑰時使用的可讀編碼。產生器會先把它解碼為金鑰位元組,再透過 HMAC、時間步計數器、動態截斷和位數取模得到 TOTP 驗證碼。

TOTP 能抵抗網路釣魚攻擊嗎?

不能。網路釣魚網站可以即時轉送仍在有效期內的 TOTP 驗證碼,複製到設定金鑰的人也能產生後續驗證碼。帳號服務支援時,Passkey 和硬體安全金鑰可以提供抗網路釣魚驗證。