名詞解釋
什麼是一次性密碼(OTP)— TOTP/HOTP/簡訊的差異與限制
一次性密碼(OTP)是一種只用一次、且只在短時間內有效的拋棄式驗證碼。本文從防禦視角,講解驗證器 App 的 TOTP、以計數為基礎的 HOTP、以及用簡訊送達的驗證碼三者的差異,說明它為何對密碼外洩有很強的防護,以及它的限制——中間人釣魚仍可能將它攻破,並刻意不寫攻擊手法。
只用一次、拋棄即丟——這就是一次性密碼(OTP)。本文整理各種類的差異,以及意外少有人知的限制(釣魚仍可能將它攻破)(不會寫出攻擊手法)。
種類:TOTP / HOTP / SMS-OTP
它們常被一律歸為「拋棄式驗證碼」,但依產生方式的不同,可分成三種。
TOTP(以時間為基礎)
由 App 從共用祕密+目前時間計算而得。大約每 30 秒切換一次。可離線運作。
HOTP(計數)
依「次數(計數)」而非時間前進。每按一次就給下一個驗證碼。硬體權杖等會使用。
SMS-OTP
用簡訊送出驗證碼。方便但易受 SIM 交換與中繼攻擊,是最脆弱的方式。
它們都同樣具有「只用一次、短命」的性質,所以即使固定密碼外洩,那個驗證碼本身也很難被重複使用。特別是 TOTP,它不經過網路、在 App 內部計算,因此沒有像簡訊那樣的攔截路徑。
強項與限制:對釣魚仍然「交得出去」
OTP 補上了固定密碼的弱點,但它並非萬能。決定性的限制在於「由人來讀取並輸入驗證碼」這一點。
OTP 奏效的場景
- 擋下因密碼外洩/重複使用造成的帳號被盜
- 即使被偷看到,也會很快失效、難以被重複使用
- 驗證器 App 的 TOTP 可離線運作,比簡訊更抗攔截
OTP 被攻破的場景
- 中間人(AiTM)釣魚:假網站把 OTP 中繼給真網站並登入
- SIM 交換:劫持手機號碼、抽走 SMS-OTP
- 根本原因=人能把驗證碼交給假網站(=它並未繫結在網域上)
本站的觀點:OTP 是中途站,終點是通行金鑰
OTP 是脫離「只有密碼」的一個絕佳第一步。事實上,不論是簡訊還是 TOTP,光是開起來就能擋下大半的帳號被盜。但本站把 OTP 定位為中途站,而非終點。只要中間人釣魚仍是真實的威脅,最終形態就是簽章繫結在網域上、從結構上無法對假網站出示的通行金鑰(FIDO2)。優先順序很清楚:先在所有帳戶開啟 OTP,再從王國之鑰(電子郵件、網域、支付)開始依序提升到通行金鑰。重點是不要依賴「靠小心來識破假網站」。
接下來閱讀
- 術語:什麼是雙因素驗證(2FA)(OTP 作為「第二個證明」被使用的脈絡)/ 什麼是通行金鑰(超越 OTP 限制的抗釣魚能力)
- 術語:什麼是釣魚(理解中繼 OTP 的中間人 AiTM)
- 入門:如何正確挑選多因素認證(MFA)(在實務中選定方式)
FAQ
Q一次性密碼和一般密碼有什麼不同?
一般密碼在你更改之前都保持不變(固定),所以一旦外洩,在你更換之前就會持續被濫用。一次性密碼(OTP)則是拋棄式的——只用一次、且只在短時間內有效——在被使用的那一刻就失效。因此即使被偷看到也很難被重複使用,能補上固定密碼的弱點(外洩與重複使用)。許多服務會把它當作在密碼之上的『另一個證明』,作為雙因素驗證的一種方式來使用。
Q用簡訊收取的一次性密碼安全嗎?
它確實比只有密碼強,但在 OTP 之中屬於最弱的一類。簡訊可能透過 SIM 交換(劫持你的手機號碼)被攔截,或被中間人釣魚在假網站中繼而抽走。可以的話,請往驗證器 App 的 TOTP 遷移,重要帳戶則進一步遷移到通行金鑰。
Q為什麼驗證器 App 的驗證碼每 30 秒左右就會變?
因為那是 TOTP(以時間為基礎的一次性密碼)。App 和服務會各自從共用的祕密(secret)與目前時間,以固定的間隔(多半是 30 秒)計算出相同的驗證碼。時間一到,舊的驗證碼就失效,換成新的。保持它短命,是為了盡量縮短被偷看到的驗證碼還能用的時間窗。