前言
隨著越來越多的軟體推廣與強制雙重因子驗證 2FA,我的手機也裝上了 Google Authenticator,但老實說,很長一段時間我只知道「打開 App → 輸入六位數字」,對於這組數字為什麼會一直變、伺服器又是怎麼驗證的,其實沒有真正了解過。直到最近在測試一些相關登入邏輯才回來補齊這塊知識。
資安當中的驗證因子
- 你知道的東西 What you know:密碼、PIN code
- 你擁有的東西 What you have:手機、實體金鑰、App 產生的驗證碼
- 你是誰 What you are:指紋、臉部、虹膜
雙重因子驗證(2FA)
相較於傳統單一密碼:
- 資料庫被駭密碼外洩
- 使用者重複使用密碼、弱密碼、遺忘
- 重放攻擊(Replay Attack)
- 社交工程或釣魚網站
為了提高了安全性,雙重因子驗證要求兩種以上不同驗證因子,安全性通常來自於不同類型因子的組合,而不是同一類一直疊加,舉例:
- 密碼 + SMS 驗證碼
- 密碼 + Google Authenticator 驗證碼
- 密碼 + 指紋
一次性密碼(OTP)
OTP 是一種只能使用一次、且通常具有時間或事件限制的密碼。即使攻擊者攔截了 OTP,也很難在有效期限內再次使用。OTP 並不是單一技術,而是一個概念,底下有多種實作方式有各自的優缺點:
| OTP 類型 | 說明 | 優點 | 缺點 | 常見使用場景 |
|---|---|---|---|---|
| 簡訊 OTP (SMS OTP) | 伺服器產生隨機驗證碼,透過簡訊傳送到使用者手機 | 實作簡單、使用者熟悉、不需額外 App | 易受 SIM Swap 攻擊、可能被攔截或延遲、有發送成本 | 傳統網站登入、銀行低風險操作 |
| 電子郵件 OTP (Email OTP) | 將一次性驗證碼寄送至使用者 Email | 成本低、實作容易、不依賴手機 | Email 本身可能已被入侵、即時性差 | 註冊驗證、忘記密碼流程 |
| 硬體 (Token OTP) | 使用實體裝置產生定期變化的 OTP | 不依賴網路、安全性高、難以遠端攻擊 | 成本高、遺失需補發、不方便攜帶 | 企業內部系統、金融機構 |
| 應用程式 OTP (TOTP) | 透過 App(如 Google Authenticator)根據時間產生 OTP | 不需網路、標準化、安全性高、成本低 | Secret 外洩即失效、可能遭即時釣魚 | 主流 2FA、雲端服務 |
| 事件型 OTP (HOTP) | 每次使用後遞增計數器產生新 OTP | 不依賴時間、不受時鐘誤差影響 | 容易不同步、實作較複雜 | 特定硬體 Token |
從安全性與實務角度來看 TOTP,是目前安全性、成本與使用體驗之間最平衡的 OTP 方案,也是現代 2FA 的主流選擇,也是 Google Authenticator、Microsoft Authenticator、Authy 在做的事。