五個常見的 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
產品開發日誌
3會員
5內容數
有關AI和網絡安全的產品人日誌
你可能也想看
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
本文介紹如何對 Telegram 憑證監控機器人的代碼進行優化,包括新增指令、讀取變數、提高可讀性和可維護性。
Thumbnail
標示全部為已讀失效 最近發現留言系統中,"標示全部為已讀"的速度明顯變慢,甚至有時會失效。許多使用者都報告遇到了相同的問題。這實際上是程式設計中一個常見的漏洞。系統沒有充分考慮到整體容量問題與效能,才導致了這樣的情況。(實際原因待查,此處僅為一般解說),當系統開始顯示緩慢或出現其他問題時,通常
Thumbnail
標示全部為已讀失效 最近發現留言系統中,"標示全部為已讀"的速度明顯變慢,甚至有時會失效。許多使用者都報告遇到了相同的問題。這實際上是程式設計中一個常見的漏洞。系統沒有充分考慮到整體容量問題與效能,才導致了這樣的情況。(實際原因待查,此處僅為一般解說),當系統開始顯示緩慢或出現其他問題時,通常
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
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
Thumbnail
在專案中與廠商測試API回傳的json字串出現無法解析的狀況,記錄發現過程與解決的紀錄,提供程式面和檔案面的解決方法。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
熱騰騰的文章又來囉~ 在開始之前想先聊聊為甚麼我想些 picoCTF 這系列的文章。 St
Thumbnail
熱騰騰的文章又來囉~ 在開始之前想先聊聊為甚麼我想些 picoCTF 這系列的文章。 St
Thumbnail
本章節介紹C#的「例外處理」,包括使用try-catch語法處理錯誤,finally關鍵字的使用,以及如何主動引發和自定義異常。
Thumbnail
本章節介紹C#的「例外處理」,包括使用try-catch語法處理錯誤,finally關鍵字的使用,以及如何主動引發和自定義異常。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News