MFA 與 2FA 總覽
很多人聽到 MFA,第一反應是:
登入時多輸入一組驗證碼。但這只是最表面的理解。
MFA 真正要解決的問題是:
即使密碼外洩,攻擊者也不能只靠密碼登入。所以 MFA 不是「多一個步驟」而已,而是身份系統的第二道防線。
如果設計得好,它可以擋下大量 credential stuffing、password spraying、釣魚後密碼外洩、資料庫密碼重用等攻擊。
如果設計得不好,它也可能只是增加使用者麻煩,卻仍然擋不住 SIM swap、MFA fatigue、釣魚代理、客服社交工程和帳號恢復漏洞。
一、 一句話回答
如果面試官問:
MFA 和 2FA 是什麼?怎麼設計?
可以先回答:
MFA 是 Multi-Factor Authentication,多因素驗證,要求使用者使用兩種以上不同類型的因素證明身份;2FA 是 Two-Factor Authentication,通常指剛好使用兩種因素,是 MFA 的一種。常見因素包含知識因素,例如密碼;持有因素,例如手機、硬體安全金鑰、Authenticator app;以及生物特徵,例如指紋或臉部辨識。實作上不能只看「多一步」是否存在,還要看因素是否真的獨立、是否容易被釣魚、是否能防重放、是否有備援與恢復流程。一般安全強度從低到高大致是 Email/SMS OTP、TOTP、Push with number matching、WebAuthn/Passkey 或硬體安全金鑰。成熟系統會搭配 risk-based authentication,在新裝置、新地點、敏感操作、異常風險時才提高驗證強度,並對 MFA 綁定、解除、重設做重新驗證、通知、稽核與 session 控制。
短一點可以說:
MFA 不是多輸入一組碼,
而是要求攻擊者同時突破不同類型的身份證明。二、 MFA、2FA、2SV 的差異
這幾個詞常被混用。
| 名稱 | 意義 | 重點 |
|---|---|---|
| MFA | Multi-Factor Authentication,多因素驗證 | 兩種以上不同因素 |
| 2FA | Two-Factor Authentication,雙因素驗證 | 剛好兩種因素 |
| 2SV | Two-Step Verification,兩步驟驗證 | 兩個步驟,不一定是不同因素 |
例如:
密碼 + TOTP這通常是 2FA,因為:
- 密碼是知識因素。
- TOTP secret 存在使用者裝置,是持有因素。
但:
密碼 + 安全問題看起來是兩步,但不一定算好的 MFA。因為兩者都偏知識因素,而且安全問題常可被猜到、查到或社交工程取得。
所以設計時要問:
這兩個步驟是否真的來自不同因素?
攻擊者取得其中一個後,另一個是否仍然獨立?三、 三種常見因素
身份驗證常用三種因素分類。
| 類型 | 英文 | 例子 |
|---|---|---|
| 你知道的東西 | Something you know | 密碼、PIN |
| 你擁有的東西 | Something you have | 手機、Authenticator app、硬體安全金鑰、智慧卡 |
| 你是什麼 | Something you are | 指紋、臉部、虹膜 |
知識因素
常見例子:
- 密碼。
- PIN。
- 安全問題。
優點:
- 實作簡單。
- 使用者熟悉。
- 不需要額外裝置。
缺點:
- 容易被重用。
- 容易被釣魚。
- 容易被猜測或爆破。
- 密碼資料庫外洩後有連鎖風險。
持有因素
常見例子:
- SMS OTP。
- Email OTP。
- TOTP app。
- Push notification。
- Passkey / WebAuthn security key。
- 智慧卡。
- 裝置憑證。
持有因素的重點是:
使用者需要控制某個裝置或憑證。但持有因素也有強弱差異。
SMS OTP 依賴電信網路與 SIM 卡,容易受 SIM swap、簡訊攔截、門號移轉攻擊影響。
WebAuthn / Passkey 則透過公私鑰和 origin binding,釣魚抗性更好。
生物特徵
常見例子:
- 指紋。
- Face ID。
- Windows Hello。
生物特徵容易被誤解成:
我的臉就是密碼。比較準確的理解是:
生物特徵通常用來解鎖本機裝置或本機私鑰,
它本身不應直接當成可在伺服器比對的秘密。例如 Passkey 使用時,指紋或臉部辨識常是「啟用本機私鑰」的方式,而真正向網站證明身份的是私鑰簽章。
NIST 也強調,生物特徵本身不應單獨作為遠端身份驗證的唯一 authenticator;它通常是啟用某個 authenticator 的 activation factor。
四、 常見 MFA 方法比較
| 方法 | 類型 | 優點 | 主要風險 |
|---|---|---|---|
| Email OTP | 持有 email 帳號 | 實作容易、使用者熟悉 | email 被盜就失效、延遲、釣魚 |
| SMS OTP | 持有手機門號 | 普及、低門檻 | SIM swap、攔截、社交工程 |
| TOTP | 持有 authenticator app | 離線可用、成本低 | 可被釣魚代理重放、備份恢復要設計 |
| Push | 持有手機 app | 體驗好 | MFA fatigue、誤按同意 |
| Push + number matching | 持有手機 app | 降低誤按與疲勞攻擊 | 仍可能被社交工程 |
| Backup Codes | 預先保存的恢復碼 | 裝置遺失時救援 | 保存不當會外洩 |
| Passkey / WebAuthn | 持有私鑰裝置 | 釣魚抗性強、可無密碼 | 裝置支援與恢復策略要設計 |
| 硬體安全金鑰 | 持有實體 key | 高安全、企業適合 | 成本、遺失與備援 |
面試時可以這樣分層:
有 MFA 比沒有好。
TOTP 通常比 SMS 更好。
Push 要防疲勞攻擊。
Passkey / WebAuthn 更接近釣魚抗性 MFA。五、 MFA 擋什麼攻擊
MFA 最直接的價值是降低密碼失守後的損害。
常見可降低的風險:
- 密碼重用。
- credential stuffing。
- password spraying。
- 暴力破解。
- 資料庫密碼外洩。
- 部分釣魚攻擊。
- 被偷到舊密碼。
例如攻擊者拿到:
alice@example.com / Password123!如果沒有 MFA,攻擊者可以直接登入。
如果有 TOTP,攻擊者還需要:
當下有效的 6 位數 OTP。如果有 WebAuthn,攻擊者還需要:
使用者註冊過的私鑰裝置,且 challenge 必須對應正確網站 origin。這就是安全強度差異。
六、 MFA 擋不了什麼
MFA 很重要,但不是無敵。
1. 即時釣魚代理
攻擊者可以建立假登入頁,讓使用者輸入密碼與 OTP,然後即時轉送到真正網站。
這種攻擊可以繞過:
- SMS OTP。
- Email OTP。
- TOTP。
但較難繞過:
- WebAuthn。
- Passkey。
- FIDO2 security key。
因為 WebAuthn 有 origin binding,私鑰簽章只對正確網站 origin 有效。
2. MFA fatigue
Push MFA 如果只是問:
是否同意登入?攻擊者可以一直嘗試登入,讓使用者手機收到大量通知,最後誤按同意。
防法:
- number matching。
- 顯示登入地點、裝置、瀏覽器。
- 限制 push 次數。
- 高風險時改用更強驗證。
- 允許使用者回報「這不是我」。
3. SIM swap
SMS OTP 的風險是手機門號不完全由使用者控制。
攻擊者可能透過電信商社交工程或資料外洩,把受害者門號移到攻擊者 SIM。
所以高風險系統不應把 SMS 當作最高信任因素。
4. 帳號恢復流程
很多系統 MFA 做得不錯,但帳號恢復很弱。
例如:
忘記 MFA?回答安全問題就可以關閉。這會讓攻擊者繞過 MFA。
MFA 強度取決於整個生命週期:
- 綁定。
- 使用。
- 備援。
- 重設。
- 解除。
- 帳號恢復。
七、 什麼時候要求 MFA
MFA 可以有兩種策略。
1. Always-on MFA
每次登入都要求 MFA。
適合:
- 後台管理員。
- 金融帳號。
- 醫療資料。
- 政府服務。
- 企業內部系統。
- 高權限操作員。
優點是安全清楚。
缺點是使用者負擔較高。
2. Risk-based MFA
平常登入不一定每次加驗,但在風險升高時要求 MFA。
常見觸發條件:
- 新裝置。
- 新地點。
- 新 IP / ASN。
- 高風險國家或代理。
- 登入失敗次數異常。
- 修改密碼。
- 綁定或解除第三方登入。
- 新增 / 重設 MFA。
- 修改 email 或手機。
- 提款、付款、查看敏感資料。
- 管理員操作。
這種設計比較符合產品體驗:
低風險時少打擾,
高風險時提高保護。但要注意,risk-based MFA 的前提是你有足夠風險訊號和紀錄,而不是憑感覺。
八、 MFA 綁定流程
啟用 MFA 本身也是高風險操作。
因為一旦攻擊者登入受害者帳號,就可能綁定自己的 MFA,讓受害者被鎖在外面。
安全綁定流程應該是:
重點:
- 綁定前要求 re-authentication。
- Secret 先 pending,不要一產生就啟用。
- 必須驗證使用者真的能產生正確 code。
- 顯示 backup codes。
- 寄出安全通知。
- 記錄 audit log。
- 高風險情境可撤銷其他 session。
九、 MFA 解除與重設
解除 MFA 比啟用 MFA 更危險。
因為攻擊者常想做的是:
登入受害者帳號 -> 關閉 MFA -> 長期控制帳號。解除 MFA 應要求:
- 目前登入。
- 近期重新驗證。
- 通過既有 MFA。
- 或通過強帳號恢復流程。
- 寄出通知。
- 記錄 audit log。
- 高風險時延遲生效或人工審核。
重設 MFA 的設計要特別小心。
比較安全的恢復方式:
- Backup codes。
- 已登入可信裝置加強驗證。
- Passkey / security key 備援。
- 管理員協助,但要有嚴格流程。
- 高信任身份驗證,視產品場景而定。
比較危險的方式:
- 只靠客服問幾個問題。
- 只靠可被盜的 email。
- 只靠安全問題。
- 只靠上傳容易偽造的截圖。
MFA 的弱點常常不在登入當下,而在「忘記 MFA 怎麼辦」。
十、 Backup Codes
Backup codes 是 MFA 系統的必要備援之一。
它通常是一組一次性代碼:
8H7K-2D91
M4Q9-LA30
P2Z8-XC77設計原則:
- 只顯示一次。
- 伺服器只存 hash。
- 使用後立即失效。
- 可以重新產生,但會讓舊 codes 全部失效。
- 下載或查看時要求重新驗證。
- 使用 backup code 登入後寄通知。
- 使用 backup code 後建議要求補新的 MFA。
Backup codes 的定位是:
救援用,不是日常登入用。十一、 MFA 與 Session
通過 MFA 後,session 應該記錄驗證強度。
例如:
type Session = {
userId: string
authenticatedAt: Date
mfaVerifiedAt: Date | null
assuranceLevel: 'password' | 'mfa' | 'phishing_resistant'
}這樣敏感操作可以要求:
最近 10 分鐘內通過 MFA。例如:
- 修改密碼。
- 修改 email。
- 新增第三方登入。
- 新增或解除 MFA。
- 查看 API key。
- 付款。
- 匯款。
- 刪除帳號。
不要只用:
session 還有效,所以什麼都能做。更成熟的模型是:
登入 session 有效;
但敏感操作需要 fresh MFA。十二、 MFA 資料模型
可以有一張 authenticators 表:
create table authenticators (
id uuid primary key,
user_id uuid not null references users(id),
type text not null,
name text,
secret_hash text,
public_key text,
credential_id text,
phone_number text,
email text,
enabled boolean not null default false,
created_at timestamp not null,
verified_at timestamp,
last_used_at timestamp
);不同類型會用到不同欄位:
| 類型 | 主要資料 |
|---|---|
| TOTP | encrypted secret 或 secret reference |
| WebAuthn | credential id、public key、sign counter |
| SMS | phone number、verified 狀態 |
| Email OTP | email、verified 狀態 |
| Backup code | hashed one-time code |
實務上可以拆表,避免一張表欄位太雜。
但概念上要保留:
- 一個 user 可有多個 authenticator。
- 每個 authenticator 有生命週期。
- 綁定時先 pending。
- 啟用後才能用。
- 使用後更新 last_used_at。
- 移除和重設要可稽核。
十三、 常見錯誤
1. 把 Email OTP 當成強 MFA
如果使用者登入帳號本身就是 email,email OTP 的獨立性有限。
攻擊者若已控制 email,可能同時能:
- 重設密碼。
- 收 MFA code。
- 接收安全通知。
Email OTP 可以作為低成本驗證或備援,但高風險系統不應把它當最高強度。
2. MFA 綁定不要求重新驗證
錯誤:
只要目前 session 有效,就可以新增 TOTP。正確:
新增 MFA 前要求近期重新驗證。3. 解除 MFA 太容易
錯誤:
按一下就關閉 MFA。正確:
解除 MFA 要通過既有 MFA 或強恢復流程,並寄通知與寫 audit log。4. 沒有防 OTP 重試
錯誤:
6 位數 OTP 可以無限猜。正確:
限制嘗試次數、節流、鎖定或風險升級。5. 沒有備援
錯誤:
使用者手機遺失就只能找客服人工處理。正確:
提供 backup codes、第二個 authenticator、passkey/security key 備援。6. 忽略釣魚抗性
錯誤:
有 TOTP 就等於防釣魚。正確:
TOTP 可被即時釣魚代理轉送;WebAuthn / Passkey 才更接近 phishing-resistant。十四、 面試追問題庫
Q1:MFA 和 2FA 差在哪?
MFA 是多因素驗證,代表使用兩種以上不同類型的因素;2FA 是雙因素驗證,通常指剛好使用兩種因素。2FA 是 MFA 的一種。
Q2:密碼加安全問題算 MFA 嗎?
通常不算好的 MFA,因為兩者都偏知識因素,而且安全問題容易被猜到、查到或透過社交工程取得。MFA 應該使用不同因素,例如密碼加 TOTP、密碼加 WebAuthn。
Q3:SMS OTP 有什麼問題?
SMS OTP 普及、低門檻,但有 SIM swap、簡訊攔截、門號移轉、社交工程、電信商風險。它比沒有 MFA 好,但不適合當高風險系統的最高強度驗證。
Q4:TOTP 是否防釣魚?
TOTP 可以降低密碼外洩風險,但不能完全防即時釣魚代理。攻擊者可以騙使用者輸入 TOTP,立刻轉送到真正網站。要更強的釣魚抗性,應使用 WebAuthn / Passkey / FIDO2。
Q5:Passkey 為什麼比較抗釣魚?
Passkey / WebAuthn 使用公私鑰與 origin binding。私鑰保存在使用者裝置或同步憑證管理系統中,網站只保存 public key。登入時瀏覽器會把 challenge 綁定到正確 origin,因此釣魚網站無法拿同一個簽章登入真正網站。
Q6:MFA 綁定和解除為什麼是高風險操作?
因為攻擊者若能新增自己的 MFA,就能鎖定帳號;若能解除受害者 MFA,就能降低帳號防線。所以新增、解除、重設 MFA 都應要求近期重新驗證、通知、audit log,必要時撤銷其他 session。
Q7:Risk-based MFA 是什麼?
Risk-based MFA 是根據風險訊號決定是否加驗,例如新裝置、新地點、異常 IP、敏感操作、管理員操作。它的目標是在安全和體驗間取得平衡:低風險少打擾,高風險提高驗證強度。
十五、 實作題
題目一:設計 MFA 啟用流程
請描述使用者啟用 TOTP 的流程。
好的答案應包含:
- 使用者已登入。
- 要求近期重新驗證。
- 產生 pending secret。
- 顯示 QR code。
- 使用者輸入第一次 TOTP。
- 驗證成功後才啟用。
- 產生 backup codes。
- 寄通知。
- 寫 audit log。
題目二:設計敏感操作重新驗證
情境:
使用者要修改 email 或新增第三方登入。請設計檢查:
function requireFreshMfa(session) {
if (!session.mfaVerifiedAt) {
throw new Error('MFA_REQUIRED')
}
const ageMs = Date.now() - session.mfaVerifiedAt.getTime()
if (ageMs > 10 * 60 * 1000) {
throw new Error('FRESH_MFA_REQUIRED')
}
}要說明:
- session 有效不代表可做敏感操作。
- MFA 驗證應有 freshness。
- 通過後可提升 session assurance level。
題目三:設計 MFA 恢復流程
情境:
使用者手機遺失,無法產生 TOTP。請設計安全恢復方式。
好的答案應包含:
- backup codes。
- 已登入可信裝置。
- 第二個 authenticator。
- 重新驗證 email / 密碼 / MFA 備援。
- 高風險帳號可人工審核。
- 恢復後寄通知。
- 可能撤銷舊 session。
- 不使用安全問題作為主要恢復方式。
十六、 資深視角
1. MFA 是身份生命週期,不是一個 checkbox
成熟的 MFA 設計包含:
- enrollment。
- verification。
- recovery。
- reset。
- removal。
- session assurance。
- audit log。
- notification。
- risk-based challenge。
只做登入頁多一個 OTP 輸入框,還不算完整。
2. MFA 強度取決於最弱的旁路
如果登入要 TOTP,但客服可以只靠生日關閉 MFA,那整體安全強度就是客服流程。
所以要一起看:
- 忘記密碼。
- 忘記 MFA。
- 換手機。
- 換 email。
- 帳號恢復。
- 客服重設。
- 管理員代管。
3. 釣魚抗性是下一個分水嶺
SMS、Email OTP、TOTP 都比單純密碼好,但它們仍可能被即時釣魚轉送。
WebAuthn / Passkey 的重要性在於:
它不是只多一組 code,
而是讓憑證和正確網站 origin 綁定。這會是高風險系統、企業管理員、金融與政府服務越來越重要的方向。
4. 體驗不是安全的敵人
糟糕的 MFA 體驗會導致:
- 使用者關閉 MFA。
- 客服壓力增加。
- 使用者把 backup code 亂存。
- 管理員設白名單繞過。
好的設計應該是:
- 預設推薦更安全的方法。
- 低風險少打擾。
- 高風險明確加驗。
- 恢復流程清楚。
- 錯誤訊息不洩漏帳號狀態。
- 安全通知能讓使用者理解發生什麼事。
總結
| 問題 | 回答重點 |
|---|---|
| MFA | 多因素驗證,兩種以上因素 |
| 2FA | 雙因素驗證,是 MFA 的一種 |
| 三種因素 | 知識、持有、生物特徵 |
| SMS OTP | 普及但有 SIM swap 風險 |
| TOTP | 常見、離線可用,但不完全防釣魚 |
| Push | 體驗好,但要防 MFA fatigue |
| Passkey/WebAuthn | 公私鑰與 origin binding,釣魚抗性較好 |
| Backup codes | MFA 恢復用的一次性代碼 |
| Risk-based MFA | 高風險情境才加驗 |
| MFA 生命週期 | 綁定、使用、解除、恢復、稽核都要設計 |
一句完整的面試回答可以是:
MFA 是多因素驗證,要求使用者用兩種以上不同類型因素證明身份;2FA 是 MFA 的一種,通常是兩種因素。常見因素包含密碼這類知識因素、手機或安全金鑰這類持有因素,以及指紋或臉部辨識這類生物特徵。MFA 的價值是降低密碼外洩後的帳號接管風險,但不同 MFA 強度不同:SMS 和 Email OTP 普及但風險較高,TOTP 較常見但仍可能被即時釣魚代理轉送,Push 要防 MFA fatigue,Passkey / WebAuthn 因為公私鑰與 origin binding,釣魚抗性更好。成熟系統不只在登入時加一個 OTP,而是要設計 MFA 綁定、解除、重設、backup codes、risk-based challenge、fresh MFA、session assurance、通知與 audit log。