功能說明
Google Authenticator、Microsoft Authenticator、1Password 等雙重驗證 App 顯示的是每 30 秒變化一次的 6 位數驗證碼。每個驗證碼都是根據共享金鑰算出的一次性密碼:TOTP(RFC 6238)以時間為基礎,HOTP(RFC 4226)以計數器為基礎。本工具以相同方法根據金鑰計算驗證碼,可用來測試雙重驗證設定、偵錯伺服器實作,或確認某一時刻的驗證碼應該是多少。
結果包含目前驗證碼與即時倒數,以及上一個和下一個驗證碼(伺服器常常也接受它們,以容忍少量時鐘誤差)。
使用方法
- 貼上 Base32 金鑰(字母 A–Z 與數字 2–7,空格和大小寫不影響),或貼上 QR 碼中的完整
otpauth://URI。點選範例即可試用。 - 選擇 TOTP 或 HOTP,並設定與帳號一致的演算法、位數和時間間隔。otpauth URI 中的設定優先。
- 使用 HOTP 時輸入計數器,點選計數器 +1 逐一查看驗證碼。
- 複製目前驗證碼,倒數顯示它還能用多久。
範例
示範金鑰 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 碼交給使用者,再把伺服器算出的驗證碼和這裡顯示的比對。伺服器通常也會接受上一個和下一個驗證碼,以容忍時鐘誤差。