跳至主要內容
Skip to content

MFA 與 2FA 總覽

很多人聽到 MFA,第一反應是:

text
登入時多輸入一組驗證碼。

但這只是最表面的理解。

MFA 真正要解決的問題是:

text
即使密碼外洩,攻擊者也不能只靠密碼登入。

所以 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 控制。

短一點可以說:

text
MFA 不是多輸入一組碼,
而是要求攻擊者同時突破不同類型的身份證明。

二、 MFA、2FA、2SV 的差異

這幾個詞常被混用。

名稱意義重點
MFAMulti-Factor Authentication,多因素驗證兩種以上不同因素
2FATwo-Factor Authentication,雙因素驗證剛好兩種因素
2SVTwo-Step Verification,兩步驟驗證兩個步驟,不一定是不同因素

例如:

text
密碼 + TOTP

這通常是 2FA,因為:

  • 密碼是知識因素。
  • TOTP secret 存在使用者裝置,是持有因素。

但:

text
密碼 + 安全問題

看起來是兩步,但不一定算好的 MFA。因為兩者都偏知識因素,而且安全問題常可被猜到、查到或社交工程取得。

所以設計時要問:

text
這兩個步驟是否真的來自不同因素?
攻擊者取得其中一個後,另一個是否仍然獨立?

三、 三種常見因素

身份驗證常用三種因素分類。

類型英文例子
你知道的東西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。
  • 智慧卡。
  • 裝置憑證。

持有因素的重點是:

text
使用者需要控制某個裝置或憑證。

但持有因素也有強弱差異。

SMS OTP 依賴電信網路與 SIM 卡,容易受 SIM swap、簡訊攔截、門號移轉攻擊影響。

WebAuthn / Passkey 則透過公私鑰和 origin binding,釣魚抗性更好。

生物特徵

常見例子:

  • 指紋。
  • Face ID。
  • Windows Hello。

生物特徵容易被誤解成:

text
我的臉就是密碼。

比較準確的理解是:

text
生物特徵通常用來解鎖本機裝置或本機私鑰,
它本身不應直接當成可在伺服器比對的秘密。

例如 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高安全、企業適合成本、遺失與備援

面試時可以這樣分層:

text
有 MFA 比沒有好。
TOTP 通常比 SMS 更好。
Push 要防疲勞攻擊。
Passkey / WebAuthn 更接近釣魚抗性 MFA。

五、 MFA 擋什麼攻擊

MFA 最直接的價值是降低密碼失守後的損害。

常見可降低的風險:

  • 密碼重用。
  • credential stuffing。
  • password spraying。
  • 暴力破解。
  • 資料庫密碼外洩。
  • 部分釣魚攻擊。
  • 被偷到舊密碼。

例如攻擊者拿到:

text
alice@example.com / Password123!

如果沒有 MFA,攻擊者可以直接登入。

如果有 TOTP,攻擊者還需要:

text
當下有效的 6 位數 OTP。

如果有 WebAuthn,攻擊者還需要:

text
使用者註冊過的私鑰裝置,且 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 如果只是問:

text
是否同意登入?

攻擊者可以一直嘗試登入,讓使用者手機收到大量通知,最後誤按同意。

防法:

  • number matching。
  • 顯示登入地點、裝置、瀏覽器。
  • 限制 push 次數。
  • 高風險時改用更強驗證。
  • 允許使用者回報「這不是我」。

3. SIM swap

SMS OTP 的風險是手機門號不完全由使用者控制。

攻擊者可能透過電信商社交工程或資料外洩,把受害者門號移到攻擊者 SIM。

所以高風險系統不應把 SMS 當作最高信任因素。

4. 帳號恢復流程

很多系統 MFA 做得不錯,但帳號恢復很弱。

例如:

text
忘記 MFA?回答安全問題就可以關閉。

這會讓攻擊者繞過 MFA。

MFA 強度取決於整個生命週期:

  • 綁定。
  • 使用。
  • 備援。
  • 重設。
  • 解除。
  • 帳號恢復。

七、 什麼時候要求 MFA

MFA 可以有兩種策略。

1. Always-on MFA

每次登入都要求 MFA。

適合:

  • 後台管理員。
  • 金融帳號。
  • 醫療資料。
  • 政府服務。
  • 企業內部系統。
  • 高權限操作員。

優點是安全清楚。

缺點是使用者負擔較高。

2. Risk-based MFA

平常登入不一定每次加驗,但在風險升高時要求 MFA。

常見觸發條件:

  • 新裝置。
  • 新地點。
  • 新 IP / ASN。
  • 高風險國家或代理。
  • 登入失敗次數異常。
  • 修改密碼。
  • 綁定或解除第三方登入。
  • 新增 / 重設 MFA。
  • 修改 email 或手機。
  • 提款、付款、查看敏感資料。
  • 管理員操作。

這種設計比較符合產品體驗:

text
低風險時少打擾,
高風險時提高保護。

但要注意,risk-based MFA 的前提是你有足夠風險訊號和紀錄,而不是憑感覺。

八、 MFA 綁定流程

啟用 MFA 本身也是高風險操作。

因為一旦攻擊者登入受害者帳號,就可能綁定自己的 MFA,讓受害者被鎖在外面。

安全綁定流程應該是:

重點:

  • 綁定前要求 re-authentication。
  • Secret 先 pending,不要一產生就啟用。
  • 必須驗證使用者真的能產生正確 code。
  • 顯示 backup codes。
  • 寄出安全通知。
  • 記錄 audit log。
  • 高風險情境可撤銷其他 session。

九、 MFA 解除與重設

解除 MFA 比啟用 MFA 更危險。

因為攻擊者常想做的是:

text
登入受害者帳號 -> 關閉 MFA -> 長期控制帳號。

解除 MFA 應要求:

  • 目前登入。
  • 近期重新驗證。
  • 通過既有 MFA。
  • 或通過強帳號恢復流程。
  • 寄出通知。
  • 記錄 audit log。
  • 高風險時延遲生效或人工審核。

重設 MFA 的設計要特別小心。

比較安全的恢復方式:

  • Backup codes。
  • 已登入可信裝置加強驗證。
  • Passkey / security key 備援。
  • 管理員協助,但要有嚴格流程。
  • 高信任身份驗證,視產品場景而定。

比較危險的方式:

  • 只靠客服問幾個問題。
  • 只靠可被盜的 email。
  • 只靠安全問題。
  • 只靠上傳容易偽造的截圖。

MFA 的弱點常常不在登入當下,而在「忘記 MFA 怎麼辦」。

十、 Backup Codes

Backup codes 是 MFA 系統的必要備援之一。

它通常是一組一次性代碼:

text
8H7K-2D91
M4Q9-LA30
P2Z8-XC77

設計原則:

  • 只顯示一次。
  • 伺服器只存 hash。
  • 使用後立即失效。
  • 可以重新產生,但會讓舊 codes 全部失效。
  • 下載或查看時要求重新驗證。
  • 使用 backup code 登入後寄通知。
  • 使用 backup code 後建議要求補新的 MFA。

Backup codes 的定位是:

text
救援用,不是日常登入用。

十一、 MFA 與 Session

通過 MFA 後,session 應該記錄驗證強度。

例如:

ts
type Session = {
  userId: string
  authenticatedAt: Date
  mfaVerifiedAt: Date | null
  assuranceLevel: 'password' | 'mfa' | 'phishing_resistant'
}

這樣敏感操作可以要求:

text
最近 10 分鐘內通過 MFA。

例如:

  • 修改密碼。
  • 修改 email。
  • 新增第三方登入。
  • 新增或解除 MFA。
  • 查看 API key。
  • 付款。
  • 匯款。
  • 刪除帳號。

不要只用:

text
session 還有效,所以什麼都能做。

更成熟的模型是:

text
登入 session 有效;
但敏感操作需要 fresh MFA。

十二、 MFA 資料模型

可以有一張 authenticators 表:

sql
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
);

不同類型會用到不同欄位:

類型主要資料
TOTPencrypted secret 或 secret reference
WebAuthncredential id、public key、sign counter
SMSphone number、verified 狀態
Email OTPemail、verified 狀態
Backup codehashed one-time code

實務上可以拆表,避免一張表欄位太雜。

但概念上要保留:

  • 一個 user 可有多個 authenticator。
  • 每個 authenticator 有生命週期。
  • 綁定時先 pending。
  • 啟用後才能用。
  • 使用後更新 last_used_at。
  • 移除和重設要可稽核。

十三、 常見錯誤

1. 把 Email OTP 當成強 MFA

如果使用者登入帳號本身就是 email,email OTP 的獨立性有限。

攻擊者若已控制 email,可能同時能:

  • 重設密碼。
  • 收 MFA code。
  • 接收安全通知。

Email OTP 可以作為低成本驗證或備援,但高風險系統不應把它當最高強度。

2. MFA 綁定不要求重新驗證

錯誤:

text
只要目前 session 有效,就可以新增 TOTP。

正確:

text
新增 MFA 前要求近期重新驗證。

3. 解除 MFA 太容易

錯誤:

text
按一下就關閉 MFA。

正確:

text
解除 MFA 要通過既有 MFA 或強恢復流程,並寄通知與寫 audit log。

4. 沒有防 OTP 重試

錯誤:

text
6 位數 OTP 可以無限猜。

正確:

text
限制嘗試次數、節流、鎖定或風險升級。

5. 沒有備援

錯誤:

text
使用者手機遺失就只能找客服人工處理。

正確:

text
提供 backup codes、第二個 authenticator、passkey/security key 備援。

6. 忽略釣魚抗性

錯誤:

text
有 TOTP 就等於防釣魚。

正確:

text
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。

題目二:設計敏感操作重新驗證

情境:

text
使用者要修改 email 或新增第三方登入。

請設計檢查:

ts
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 恢復流程

情境:

text
使用者手機遺失,無法產生 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 的重要性在於:

text
它不是只多一組 code,
而是讓憑證和正確網站 origin 綁定。

這會是高風險系統、企業管理員、金融與政府服務越來越重要的方向。

4. 體驗不是安全的敵人

糟糕的 MFA 體驗會導致:

  • 使用者關閉 MFA。
  • 客服壓力增加。
  • 使用者把 backup code 亂存。
  • 管理員設白名單繞過。

好的設計應該是:

  • 預設推薦更安全的方法。
  • 低風險少打擾。
  • 高風險明確加驗。
  • 恢復流程清楚。
  • 錯誤訊息不洩漏帳號狀態。
  • 安全通知能讓使用者理解發生什麼事。

總結

問題回答重點
MFA多因素驗證,兩種以上因素
2FA雙因素驗證,是 MFA 的一種
三種因素知識、持有、生物特徵
SMS OTP普及但有 SIM swap 風險
TOTP常見、離線可用,但不完全防釣魚
Push體驗好,但要防 MFA fatigue
Passkey/WebAuthn公私鑰與 origin binding,釣魚抗性較好
Backup codesMFA 恢復用的一次性代碼
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。

延伸閱讀