一次性密碼(OTP)是只用一次、用完即丟的驗證碼。本文整理各種類的差異,以及常被忽略的限制(釣魚仍可能將它攻破)(不會寫出攻擊手法)。
種類:TOTP / HOTP / SMS-OTP
它們常被一律歸為「拋棄式驗證碼」,但依產生方式的不同,可分成三種。
TOTP(以時間為基礎)
由 App 從共用祕密+目前時間計算而得。大約每 30 秒切換一次。可離線運作。
HOTP(計數)
依「次數(計數)」而非時間前進。每按一次就給下一個驗證碼。硬體權杖等會使用。
SMS-OTP
用簡訊送出驗證碼。方便但易受 SIM 交換與中繼攻擊,是最脆弱的方式。
它們都同樣具有「只用一次、短命」的性質,所以即使固定密碼外洩,那個驗證碼本身也很難被重複使用。特別是 TOTP,它不經過網路、在 App 內部計算,因此沒有像簡訊那樣的攔截路徑。
強項與限制:在假網站輸入的內容會被竊取
OTP 補上了固定密碼的弱點,但它並不是完整的防護。決定性的限制在於「由人來讀取並輸入驗證碼」這一點。
OTP 奏效的場景
- 擋下因密碼外洩/重複使用造成的帳號被盜
- 即使被偷看到,也會很快失效、難以被重複使用
- 驗證器 App 的 TOTP 可離線運作,比簡訊更抗攔截
OTP 被攻破的場景
- 中間人(AiTM)釣魚:假網站把 OTP 中繼給真網站並登入
- SIM 交換:劫持手機號碼、抽走 SMS-OTP
- 根本原因=人能把驗證碼交給假網站(=它並未繫結在網域上)
送達方式如何改變風險
「一次性密碼」涵蓋好幾種方式,弱點取決於驗證碼在哪裡產生、以及如何送到你手上。
| 方式 | 驗證碼在哪裡產生 | 如何送到你手上 | 主要弱點 |
|---|---|---|---|
| 驗證器 App(TOTP) | 你的手機上 | 不經傳送(在裝置上計算) | 在假網站輸入、手機遺失後的復原 |
| 硬體權杖 | 小型專用裝置 | 不經傳送(顯示在其螢幕上) | 在假網站輸入、裝置遺失 |
| 簡訊 | 服務的伺服器 | 行動電話網路 | 在假網站輸入、SIM 交換、簡訊攔截 |
| 電子郵件 | 服務的伺服器 | 電子郵件 | 在假網站輸入、電子郵件帳號被盜 |
所有方式共同的弱點,是被輸入到假網站。美國國家標準與技術研究院(NIST)的認證指引 SP 800-63B(第 4 版,2025 年 8 月)指出,手動輸入的一次性密碼無法做到抗釣魚,並把簡訊等使用電話網路的方式列為「受限制」。美國網路安全暨基礎設施安全局(CISA)也在 2024 年 12 月建議不要把簡訊當作第二因素。
雙因素驗證、兩步驟驗證與通行金鑰這些用語的關係,整理在什麼是雙因素驗證的比較表中。
TOTP 的原理:QR 碼裡裝著祕密
設定驗證器 App 時掃描的 QR 碼,含有服務與 App 共用的祕密值。App 用這個值與目前時間計算驗證碼,服務也做同樣的計算,確認是否一致。
- 標準(RFC 6238)建議的時間間隔是 30 秒
- 為了容許網路延遲,服務常會一併接受前一個間隔的驗證碼(標準建議最多一個間隔)
- 以計數為基礎的 HOTP(RFC 4226)則是每次(例如按一下按鈕)往前推進
由此可知,持有 QR 碼或祕密字串的人,就能產生相同的驗證碼。把設定畫面的截圖存在雲端或聊天中,等同於把密碼寫在紙上。
實際案例:網路銀行的未經授權轉帳
2023 年,日本的網路銀行未經授權轉帳急遽增加。根據日本金融廳的資料,2023 年 1 月至 11 月的損失達 5,147 件、約 80.1 億日圓(截至 12 月 8 日),件數與金額都創下歷史新高。金融廳描述的手法是:以假冒銀行的電子郵件或簡訊把使用者引導到假網站,竊取網路銀行的 ID、密碼、一次性密碼等資訊,再把錢轉走。
從這個案例可以得到兩點教訓:
- 一旦把驗證碼輸入到假網站,一次性密碼就擋不住:不論驗證碼的有效期間多短,只要在你輸入的當下就被使用,時間就來得及
- 要擋下它,關鍵在輸入之前:銀行表示不會透過電子郵件或簡訊要求提供 ID 或密碼。不在從電子郵件或簡訊連結開啟的頁面上輸入驗證碼,是使用者能採取的最可靠的一步
此後,日本的證券公司與銀行正朝著把通行金鑰等「在假網站上無法完成」的認證強制化的方向推進(什麼是通行金鑰)。
如何檢查自己的帳號與服務
把使用簡訊的帳號改用驗證器 App
打開電子郵件、密碼管理器、GitHub、雲端服務等重要帳號的雙因素驗證設定。如果使用的是簡訊,就新增驗證器 App(TOTP)並設為優先方式。如果可以使用通行金鑰,也一併新增。GitHub 請參考設定 GitHub 雙因素驗證。
為換手機或遺失手機做好準備
確認驗證器 App 可以轉移到另一台裝置(其備份或轉移功能)。把各服務的復原碼存放在手機以外的地方,例如密碼管理器中。
確認 QR 碼與祕密沒有到處散落
在照片、雲端儲存空間或聊天中,找出設定用 QR 碼或祕密字串的截圖,找到就刪除。
如果你是服務的開發者,檢視驗證規則
驗證驗證碼時限制失敗次數(否則 6 位數的驗證碼在現實中可以被暴力破解)。即使在有效期間內,同一個驗證碼也只接受一次。容許的時鐘偏移保持在一個間隔左右。為管理員帳號提供比一次性密碼更強的通行金鑰。
本站的觀點:OTP 是過渡階段,目標是通行金鑰
OTP 是脫離「只有密碼」的一個絕佳第一步。事實上,不論是簡訊還是 TOTP,光是開起來就能擋下大半的帳號被盜。但本站把 OTP 定位為過渡階段,而非最終目標。只要中間人釣魚仍是真實的威脅,目標就是簽章繫結在網域上、從結構上無法對假網站出示的通行金鑰(FIDO2)。
優先順序很清楚:先在所有帳戶開啟 OTP,再把最重要的帳戶(電子郵件、網域、支付)遷移到通行金鑰。重點是不要依賴「靠小心來識破假網站」。
出處(一手資料)
- IETF RFC 6238「TOTP: Time-Based One-Time Password Algorithm」— rfc-editor.org(30 秒的時間間隔,為網路延遲最多容許一個間隔)
- IETF RFC 4226「HOTP: An HMAC-Based One-Time Password Algorithm」— rfc-editor.org(以計數為基礎的一次性密碼、限制失敗次數)
- NIST SP 800-63B-4(2025 年 8 月)— pages.nist.gov(手動輸入的 OTP 無法抗釣魚、電話網路方式受限制、同一 OTP 只接受一次、速率限制)
- CISA「Mobile Communications Best Practice Guidance」(2024 年 12 月)— cisa.gov(PDF)(不要把簡訊當作第二因素)
- 日本金融廳:關於釣魚相關網路銀行未經授權轉帳急增的警示(日文)— fsa.go.jp(2023 年 1~11 月的件數與損失、一次性密碼等資訊遭竊)
接下來閱讀
- 術語:什麼是雙因素驗證(2FA)(OTP 作為「第二個證明」被使用的脈絡)/ 什麼是通行金鑰(比 OTP 更強的抗釣魚能力)
- 術語:什麼是釣魚(理解中繼 OTP 的中間人 AiTM)
- 入門:如何正確挑選多因素認證(MFA)(在實務中選定方式)/ 設定 GitHub 雙因素驗證(驗證器 App 與復原碼)
- 案例:7pay 盜刷事件(2019)(因沒有 2FA 而被接管的支付 App 實例)