2FA 的目標是讓密碼外洩後仍需要另一個獨立因素。設定品質取決於因素是否抗釣魚、能否被遠端攔截,以及裝置遺失時是否有受控復原;只打開簡訊驗證並把備援碼留在同一支手機,防護仍然脆弱。
依抗釣魚能力選擇第二因素
- 通行金鑰/FIDO2 安全金鑰:綁定網站 origin,最能抵抗釣魚。
- 驗證器 TOTP:離線可用,但使用者仍可能把六位碼輸入釣魚站。
- 推播確認:方便,但需防止連續轟炸與錯誤批准。
- 簡訊:受 SIM swap、攔截與轉接影響,適合作為低風險過渡或有限復原。
- 電子郵件碼:若信箱本身也是復原核心,獨立性有限。
重要帳號至少註冊兩個獨立因素
建議主要使用通行金鑰或硬體金鑰,另保留第二把實體金鑰或可信裝置。兩個因素不要都綁在同一支手機、同一個雲端帳號或同一個包包裡。
新增因素時必須重新驗證目前密碼與既有因素,並寄送安全通知;不能只靠已登入 Cookie 靜默新增。
TOTP 要正確處理秘密與時間
TOTP seed 在註冊時只應顯示一次,伺服器需加密保存,日誌不得記錄 QR Code 或 otpauth URI。驗證時允許有限時間漂移,成功後避免同一時間片重複使用。
# 概念設定,不是真實秘密
issuer: Kaelith
algorithm: SHA1
period_seconds: 30
digits: 6
accepted_window: [-1, 0, 1]
replay_protection: true伺服器與使用者裝置時間偏差過大會造成驗證失敗,因此基礎設施需同步可靠時間源。
推播驗證要顯示上下文並限制轟炸
確認畫面應顯示服務名稱、裝置、概略位置、時間與請求操作,並使用 number matching 或交易內容綁定。連續拒絕後暫停推播,改要求重新登入或聯絡支援。
使用者若收到未發起的驗證,不只按拒絕,還要檢查密碼是否外洩並撤銷工作階段。
復原流程不能比正常登入更弱
客服只憑姓名、生日或近期交易就停用 2FA,會讓攻擊者繞過第二因素。高風險復原應結合備援碼、已註冊裝置、延遲生效、人工覆核與通知。
管理員替使用者重設 2FA 時要有稽核記錄,並讓舊因素、備援碼與工作階段全部失效。
部署後測試完整生命週期
- 註冊第一與第二因素。
- 測試釣魚網域是否無法使用通行金鑰。
- 測試遺失單一裝置仍可安全復原。
- 測試移除因素需要重新驗證。
- 測試改密碼與帳號事件後因素是否保留或撤銷符合政策。
- 測試備援碼一次性、輪替與通知。
驗證成功條件
主要因素具抗釣魚能力、第二因素位於不同裝置或介質、復原流程經過測試,且任何重設都會通知帳號持有人。