兩步驟驗證帳號
產生用於啟用兩步驟驗證的金鑰及其 QR 碼,查看 Google Authenticator、Microsoft Authenticator 或 Authy 會顯示的 TOTP 或 HOTP 驗證碼,並驗證驗證碼是否有效。驗證碼在瀏覽器中計算,金鑰不會包含在分享連結中。
驗證碼

請輸入有效的金鑰以查看驗證碼。

應用程式用 QR 碼
驗證驗證碼

以伺服器的方式檢查驗證碼:接受目前的驗證碼以及前後最多 2 個步長內的驗證碼,以容許時鐘誤差。

運作方式

TOTP(Time-based One-Time Password,RFC 6238)是 Google Authenticator、Microsoft Authenticator、Authy 或 1Password 中六位數驗證碼背後的演算法。服務和你的手機共用一把金鑰;每 30 秒,雙方都以金鑰和依步長劃分的目前時間計算 HMAC,截取為六位數字並比較結果。由於在你輸入之前驗證碼不會被傳送,即使手機沒有網路連線也能使用。

HOTP(RFC 4226)是基礎演算法:它不使用時間,而是使用每次要求驗證碼時遞增的計數器。TOTP 就是把計數器替換為自 1970 年以來經過的週期數的 HOTP。金鑰以 Base32 表示,包含在 otpauth:// URI 中,於啟用兩步驟驗證時以 QR 碼形式顯示。

本工具使用瀏覽器的密碼學亂數產生器產生金鑰,計算目前、上一個和下一個驗證碼,建立 URI 及其 QR 碼,讀取現有 URI,並以與伺服器相同的時鐘誤差容許範圍驗證驗證碼。金鑰永遠不會離開你的瀏覽器,也不會包含在分享連結中。

範例

GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 59 s94287082RFC 6238 的測試向量。金鑰是 ASCII 文字 12345678901234567890 的 Base32 編碼;在 Unix 紀元後第 59 秒,步長為 1,八位數驗證碼必須正好是這個值。
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 1111111109 s07081804RFC 6238 的另一個向量,可用來檢查你的實作是否遺失了開頭的零:驗證碼是固定位數的數字字串,而不是整數。
HOTP · GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · contador 0755224RFC 4226 的第一個六位數向量。計數器為 1 時,驗證碼變為 287082。
otpauth://totp/Ejemplo:ana%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=EjemploTOTP · SHA1 · 6 · 30 s由 Google Authenticator 定義並被其他應用程式採用的 Key URI 格式。如果缺少 algorithm、digits 和 period,則預設為 SHA1、6 和 30,因此大多數 QR 碼只包含金鑰和發行者。

使用情境

  • 測試應用程式的 2FA 啟用流程:產生金鑰,用手機掃描 QR 碼,確認伺服器接受與應用程式顯示相同的驗證碼。
  • 排查伺服器為何拒絕有效的驗證碼:查看是否與上一個或下一個步長的驗證碼相符,即可發現時鐘誤差。
  • 使用 RFC 6238 和 4226 的測試向量驗證自己的 TOTP 或 HOTP 實作。
  • 讀取從其他應用程式匯出的 otpauth:// URI,查看帳號使用的演算法、位數和週期。
  • 將已有 Base32 金鑰的測試帳號加入第二個應用程式或密碼管理工具。

常見問題

為什麼伺服器會拒絕應用程式中顯示為有效的驗證碼?

幾乎都是時鐘的問題。TOTP 依賴手機和伺服器的時間一致:相差 30 秒就會算出不同的步長。因此伺服器會在兩側各接受一到兩個步長。如果驗證碼與上一個或下一個步長相符,請以 NTP 同步伺服器時間,並開啟手機的自動設定時間。

在這裡為真實帳號產生金鑰安全嗎?

金鑰由 crypto.getRandomValues 產生,不會離開你的瀏覽器,但在正式環境中,應由負責驗證驗證碼的伺服器產生並保存。本工具用於測試和除錯。請像對待密碼一樣對待任何真實金鑰:擁有它的人可以永久產生你的驗證碼。

應該使用 SHA-256、8 位數或 60 秒嗎?

理論上它們更強,但包括某些版本的 Google Authenticator 在內的多個應用程式會忽略這些參數,一律以 SHA-1、6 位數、每 30 秒計算,導致使用者看到的驗證碼被伺服器拒絕。SHA-1 作為 HMAC 仍然是安全的。基於相容性,幾乎所有服務都使用預設值。

金鑰應該多長?

RFC 4226 要求至少 128 位元,建議 160 位元,也就是 Base32 的 32 個字元。許多服務使用 80 位元(16 個字元),應用程式同樣可以接受。本工具產生 160 位元。

TOTP 能防範網路釣魚嗎?

無法完全防範。它比簡訊好得多,簡訊可能被攔截或透過 SIM 卡挾持竊取,但假冒網站可以誘使你輸入驗證碼,並在同一個 30 秒內於真實網站上使用。FIDO2 安全金鑰和通行金鑰與網域綁定,可以抵禦這種攻擊。

手機遺失了怎麼辦?

沒有金鑰就無法計算驗證碼。因此,服務在啟用 2FA 時會提供復原碼:請將它們保存在手機以外的地方。有些應用程式允許將帳號加密備份到雲端,或匯出為 QR 碼以移轉到其他裝置。