五個常見的 TOTP 問題(以及如何解決)

更新 發佈閱讀 5 分鐘

原文英文版本刊於:5 Common TOTP Mistakes Developers Make (and How to Fix them) - Authgear Blog

你是否常遇到「TOTP 驗證碼無效」的狀況?其實許多開發者在實作 TOTP 時,都會踩到一些常見的狀況或問題:時間不同步、Base32 編碼錯誤、RFC 6238 參數不一致…… 以下整理了五大常見問題,說明發生原因,以及快速修正的方法。

TOTP(時間型一次性密碼)看似簡單,六位數字、每 30 秒更新一次,但細節若處理不好,使用者很快就會卡在登入畫面。

如果你經常看到「Invalid TOTP code」這類錯誤訊息,十之八九就是以下幾個原因造成的。 文末也提供一份快速檢查清單,並附上 Authgear TOTP Authenticator 工具,方便你立即測試設定是否正確(支援 SHA-1/256/512、6–8 位數,以及 30 秒週期)。

問題一:時間不同步(Server 與驗證器時鐘不一致)

症狀

  • 驗證碼偶爾失效;使用者回報「有時候可以用、有時候不行」
  • 在本機端測試正常,但部署到 CI / Container 後就出錯

原因

TOTP 依賴「時間」計算。只要伺服器與使用者裝置的時間差超過 30–60 秒,驗證碼就會失效。

解決方式

  • 與 NTP(網路時間協定)同步時鐘
  • 驗證時允許一個小容差(例如 ±1 step),避免因輕微時差導致拒絕使用者
  • Log 記錄伺服器時間與驗證碼,方便找出系統間誤差

問題二:密鑰格式錯誤(Base32、Hex、大小寫、補字元)

原因

大部分 TOTP 密鑰是 Base32 編碼,但常見錯誤包括:誤以為是 HEX / ASCII、處理過程中刪掉字元或空白、大小寫處理不正確。

解決方式

  • 確認金鑰儲存與傳輸時使用 Base32 編碼
  • otpauth:// URI 中解析 secret= 參數,確保為 Base32 格式

參考 Google Key URI 格式規範

問題三:RFC 6238 參數不一致(位數、週期、演算法)

原因

TOTP 可配置的參數包括位數、週期、演算法。如果伺服器設定為 8 位數,但使用者端預期 6 位數;或伺服器採用 SHA-256,而 App 使用 SHA-1,就會導致驗證失敗。

解決方式

  • 採用常見預設值:6 位數、30 秒週期、SHA-1
  • 若需自訂,請確認雙方一致,並參考 RFC 6238 規範

問題四:配置資料錯誤(otpauth URI / QR Code)

原因

otpauth://totp/... URI 內含 label、issuer、secret、algorithm、digits、period 等參數。若拼字錯誤或遺漏,驗證器就會讀取到錯誤設定。

解決方式

  • 驗證並核對配置資料的 URI
  • 使用常見驗證器 App(如 Google Authenticator、Authy)交叉測試

問題五:驗證邏輯過於簡化(未處理時差、重複驗證、防暴力破解)

原因

部分實作僅做最基本的比對,忽略了使用者時差、驗證碼重複提交,或缺乏速率限制,容易造成安全風險。

解決方式

  • 驗證時允許 ±1 step 容差
  • 防止同一驗證碼被重複使用
  • 加上速率限制與異常偵測,避免暴力攻擊

快速檢查清單:遇到「TOTP 驗證碼無效」先檢查這些

  • ✅ Server 與 NTP 同步
  • ✅ 金鑰是否為 Base32 格式
  • ✅ 參數是否符合 RFC 6238(位數、週期、演算法一致)
  • ✅ 是否與 otpauth URI 中的設定相符
  • ✅ 是否已啟用時間容差(verification window)與速率限制

需要快速找出問題嗎?

在正式上線前,先用 Authgear TOTP Authenticator 測試你的金鑰與參數,確認驗證碼正確。


留言
avatar-img
留言分享你的想法!
avatar-img
產品開發日誌
3會員
5內容數
有關AI和網絡安全的產品人日誌
你可能也想看
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
在這篇文章中,將繼續介紹 TG Bot 整合 MongoDB 的相關操作。主要包括對 domain 進行驗證操作,使用的工具有 Python 、MongoDB 和 TG Bot。具體的功能需求包括新增 domain 前檢查 domain 憑證以及透過 TG Bot 檢查所有 domain 是否過期。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
本章節介紹C#的「例外處理」,包括使用try-catch語法處理錯誤,finally關鍵字的使用,以及如何主動引發和自定義異常。
Thumbnail
本章節介紹C#的「例外處理」,包括使用try-catch語法處理錯誤,finally關鍵字的使用,以及如何主動引發和自定義異常。
Thumbnail
熱騰騰的文章又來囉~ 在開始之前想先聊聊為甚麼我想些 picoCTF 這系列的文章。 St
Thumbnail
熱騰騰的文章又來囉~ 在開始之前想先聊聊為甚麼我想些 picoCTF 這系列的文章。 St
Thumbnail
標示全部為已讀失效 最近發現留言系統中,"標示全部為已讀"的速度明顯變慢,甚至有時會失效。許多使用者都報告遇到了相同的問題。這實際上是程式設計中一個常見的漏洞。系統沒有充分考慮到整體容量問題與效能,才導致了這樣的情況。(實際原因待查,此處僅為一般解說),當系統開始顯示緩慢或出現其他問題時,通常
Thumbnail
標示全部為已讀失效 最近發現留言系統中,"標示全部為已讀"的速度明顯變慢,甚至有時會失效。許多使用者都報告遇到了相同的問題。這實際上是程式設計中一個常見的漏洞。系統沒有充分考慮到整體容量問題與效能,才導致了這樣的情況。(實際原因待查,此處僅為一般解說),當系統開始顯示緩慢或出現其他問題時,通常
Thumbnail
在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
Thumbnail
在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News