TOTP 是什麼意思
TOTP 是 time-based one-time password,也就是基於時間的一次性密碼。它透過共享設定金鑰和目前時間產生一組短數字驗證碼,因此驗證碼會隨著時間推進而變化。
TOTP 是許多 Authenticator 應用程式和帳號安全系統使用的基於時間的一次性密碼方案。本指南說明 2FA、MFA、OTP、Base32 設定金鑰、otpauth 連結、演算法、位數和常見 30 秒刷新週期這些概念。
TOTP 是 time-based one-time password,也就是基於時間的一次性密碼。它透過共享設定金鑰和目前時間產生一組短數字驗證碼,因此驗證碼會隨著時間推進而變化。
TOTP 產生器會解碼設定金鑰,把目前 Unix 時間切分成時間步,使用 SHA-1、SHA-256 或 SHA-512 等 HMAC 演算法計算,再截斷成指定長度的數字驗證碼。
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 和服務端不會互相傳送目前驗證碼,而是分別透過各自時鐘計算。服務端可以接受相鄰的少量時間步來容忍一般時鐘偏差,但每多接受一個視窗都會延長截獲驗證碼可能有效的時間,因此驗證視窗應保持較小。
公式使用 Unix 時間,而不是介面顯示的本地時區。只修改時區標籤通常不會改變 TOTP 驗證碼,但系統時鐘本身不準確會讓計數器落入其他時間步,導致正確設定金鑰產生的驗證碼被拒絕。
TOTP 在密碼之外增加一個獨立因素,但它不具備抗網路釣魚性。攻擊者可以即時轉送目前驗證碼,取得共享設定金鑰的人也能計算後續驗證碼。請保護設定金鑰和恢復碼、確認登入網站來源;如果服務支援抗網路釣魚驗證,優先考慮 Passkey 或硬體安全金鑰。
OTP 是一次性密碼的總稱,TOTP 是基於時間的 OTP。2FA 表示雙因素驗證,MFA 表示多因素驗證。TOTP 驗證碼經常作為 2FA 或 MFA 中的一個驗證因素。
手動設定 Authenticator 時看到的金鑰通常是 Base32 格式,字元範圍是 A-Z 和 2-7,也可能帶空格便於閱讀。空格只是顯示格式,實際計算會使用規範化後的金鑰位元組。
很多 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 驗證碼會把共享 secret 和時間步計數器結合,再透過 HMAC 與動態截斷得到數字驗證碼。這個表格整理 Authenticator 應用程式最常見的參數。
| 參數 | 在 TOTP 中的作用 | 常見值 |
|---|---|---|
| 共享 secret / Base32 設定金鑰 | 服務和 Authenticator 共同保存的私密值,用來產生每一次驗證碼。 | 必填 |
| 時間步長 / 週期 | 每個驗證碼視窗的長度,通常由 Unix 時間除以週期得到計數器。 | 30 秒 |
| HMAC 演算法 | 動態截斷之前使用的雜湊演算法。 | SHA-1 |
| 驗證碼位數 | 取模後顯示的數字長度。 | 6 位 |
| issuer 和帳號標籤 | otpauth URI 裡的顯示資訊,不改變 TOTP 計算結果。 | 可選 |
不完全是。TOTP 是產生 OTP 的一種方法。很多服務把 TOTP 驗證碼作為 2FA 的第二個因素,所以使用者通常會把產生出來的 TOTP 值稱為 2FA 驗證碼。
TOTP 演算法使用時間步,30 秒是常見預設值。時間步更短會更不寬容,時間步更長則代表每個驗證碼有效時間更久。
不可以。有效的 TOTP 驗證碼需要共享設定金鑰,以及匹配的 period、algorithm、digits 等參數。沒有 secret 就無法計算正確驗證碼。
推薦使用 #secret=YOUR_BASE32_SECRET 這種 fragment 快捷方式。fragment 留在瀏覽器中,不會像 path 或 query 一樣傳送到伺服器。
不會。TOTP 使用 Unix 時間,不使用介面顯示的時區標籤。但裝置時鐘仍需準確,因為過快或過慢的時鐘可能選擇錯誤的時間步計數器。
Base32 是設定共享金鑰時使用的可讀編碼。產生器會先把它解碼為金鑰位元組,再透過 HMAC、時間步計數器、動態截斷和位數取模得到 TOTP 驗證碼。
不能。網路釣魚網站可以即時轉送仍在有效期內的 TOTP 驗證碼,複製到設定金鑰的人也能產生後續驗證碼。帳號服務支援時,Passkey 和硬體安全金鑰可以提供抗網路釣魚驗證。