DevToolPal
繁

TOTP / HOTP 驗證碼產生器

根據 Base32 金鑰或 otpauth:// URI 產生雙重驗證碼(TOTP 與 HOTP),支援 SHA-1/256/512、6–8 位數與即時倒數。

本機處理,不會上傳

選項

類型
位數
時間間隔

金鑰(Base32)或 otpauth:// URI

驗證碼

結果會顯示在這裡

功能說明

Google Authenticator、Microsoft Authenticator、1Password 等雙重驗證 App 顯示的是每 30 秒變化一次的 6 位數驗證碼。每個驗證碼都是根據共享金鑰算出的一次性密碼:TOTP(RFC 6238)以時間為基礎,HOTP(RFC 4226)以計數器為基礎。本工具以相同方法根據金鑰計算驗證碼,可用來測試雙重驗證設定、偵錯伺服器實作,或確認某一時刻的驗證碼應該是多少。

結果包含目前驗證碼與即時倒數,以及上一個和下一個驗證碼(伺服器常常也接受它們,以容忍少量時鐘誤差)。

使用方法

  1. 貼上 Base32 金鑰(字母 A–Z 與數字 2–7,空格和大小寫不影響),或貼上 QR 碼中的完整 otpauth:// URI。點選範例即可試用。
  2. 選擇 TOTP 或 HOTP,並設定與帳號一致的演算法、位數和時間間隔。otpauth URI 中的設定優先。
  3. 使用 HOTP 時輸入計數器,點選計數器 +1 逐一查看驗證碼。
  4. 複製目前驗證碼,倒數顯示它還能用多久。

範例

示範金鑰 JBSWY3DPEHPK3PXP 是位元組「Hello!」加上 0xDEADBEEF 的 Base32 形式。下面這個 URI(也就是 QR 碼裡編碼的內容)描述了一個使用它、採用預設設定的帳號:

otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30

在 Unix 時間 1700000000,這個金鑰對應的驗證碼是 324 550,目前時間窗口還剩 10 秒。

驗證碼是怎麼算出來的

先把 Base32 金鑰解碼成位元組。TOTP 的計數器是以秒為單位的 Unix 時間除以時間間隔後無條件捨去。計數器寫成 8 個位元組,再以金鑰做 HMAC 簽章。動態截斷依 HMAC 結果最後半個位元組選出其中 4 個位元組,再對所需位數取模,保留前導零。

常見問題

› 為什麼算出的驗證碼和驗證器 App 裡的不一樣?

TOTP 依賴時鐘,請先確認裝置時間是自動同步的。再確認演算法、位數和時間間隔與帳號一致。大多數服務使用 SHA-1、6 位數、30 秒;除非 QR 碼中有寫明,驗證器 App 會忽略其他設定。

› TOTP 和 HOTP 有什麼不同?

TOTP(RFC 6238)以目前時間除以時間間隔作為計數器,所以驗證碼每 30 秒變一次。HOTP(RFC 4226)使用一個計數器,每用掉一個驗證碼就加一。兩者都把金鑰和計數器做 HMAC,再取最後 6 到 8 位數字。

› 我的金鑰會被儲存或傳送出去嗎?

不會。驗證碼在瀏覽器中透過 Web Crypto API 計算。金鑰不會儲存、不會寫進網址列,也不會包含在分享連結中,分享連結只帶設定。不過雙重驗證金鑰等同於第二道驗證本身,請只貼上屬於你自己的金鑰。

› 能用它為自己的應用程式加入雙重驗證嗎?

可以。點選「隨機金鑰」產生 160 位元的 Base32 金鑰,放進 otpauth:// URI 或 QR 碼交給使用者,再把伺服器算出的驗證碼和這裡顯示的比對。伺服器通常也會接受上一個和下一個驗證碼,以容忍時鐘誤差。