上一篇最後提到,單靠密碼有很多風險:密碼可能被外洩、被撞庫、被釣魚,或因為使用者重複使用弱密碼而被猜中。
所以今天先回答第一個問題:如果密碼不夠安全,系統還能怎麼確認「這個人真的是本人」?
這篇會聚焦在 MFA(多因子驗證),並從最常見的 OTP、TOTP,一路講到近年越來越常被討論的 WebAuthn / Passkey。
今天內容涵蓋:
延續前一篇的科技業工程師例子:他每天登入公司系統時,除了輸入密碼,還要打開手機裡的驗證器 App,輸入一組六位數的動態密碼,才能真正進去。這多出來的一步,就是 MFA(Multi-Factor Authentication,多因子驗證)。
MFA 的概念很單純:不要只靠一種方式證明身份,而是同時要求兩種以上不同類型的證據。這些證據通常分成三類:
| 類型 | 白話說明 | 例子 |
|---|---|---|
| 你知道的東西(Something you know) | 只有你腦袋裡知道的秘密 | 密碼、PIN 碼 |
| 你擁有的東西(Something you have) | 只有你手上才有的實體物品 | 手機裡的驗證器 App、推播通知(Push Notification)、簡訊 OTP、實體安全金鑰 |
| 你本身的特徵(Something you are) | 你身體本身的特徵 | 指紋、臉部辨識 |
工程師的例子裡,密碼是「你知道的東西」,驗證器 App 產生的動態密碼是「你擁有的東西」——兩種類型都通過,才算完成 MFA。
為什麼一定要「不同類型」,而不是兩個密碼?
因為攻擊者要拿到同一類型的東西,成本差不多。如果系統要求輸入兩組密碼,攻擊者只要透過釣魚或撞庫拿到密碼,兩關一次過。但如果是密碼加上手機裡的驗證器,攻擊者就算拿到密碼外洩資料庫,還得另外偷到使用者的手機,難度完全不同。這也是為什麼 MFA 能大幅降低上一篇提到的密碼外洩、撞庫攻擊等風險。
💡 2FA 跟 MFA 差在哪?
常聽到的 2FA(雙因子驗證),其實是 MFA 的其中一種特例。
2FA 限定使用「剛好兩種」不同類型的驗證因子;MFA 則泛指使用「兩種或以上」的驗證因子。
所以可以理解成:所有 2FA 都屬於 MFA,但 MFA 不一定只有兩種驗證因子。
例如工程師使用「密碼 + 驗證器 App」登入,就是使用兩種不同的驗證因子,因此屬於 2FA,同時也屬於 MFA。
雖然都叫 MFA,但不同方法的安全性與使用體驗差很多。實務上選擇哪一種 MFA,不只是在比「有沒有多一道驗證」,也要考慮它是否容易被釣魚、是否依賴電信網路、使用者遺失裝置時能不能安全復原。
| 方法 | 屬於哪種因素 | 優點 | 風險 / 限制 |
|---|---|---|---|
| Email 驗證碼 | 可存取的帳號 | 實作簡單、使用者熟悉 | Email 被盜時會一起失效 |
| SMS OTP | 你擁有的東西 | 使用門檻低、不需要安裝 App | 容易受到 SIM swap、簡訊攔截、電信社工影響 |
| 語音 OTP | 你擁有的東西 | 不需要智慧型手機或 App | 語音信箱、轉接、電信設定都可能變成弱點 |
| TOTP App | 你擁有的東西 | 不依賴簡訊、較不容易被電信攻擊影響 | 換手機或遺失裝置時,需要備份碼或復原流程 |
| Push Notification | 你擁有的東西 | 使用體驗好,不用手動輸入代碼 | 可能被 MFA fatigue / push bombing 攻擊濫用 |
| Security Key / Passkey | 你擁有的東西 | 抗釣魚能力強,使用體驗好 | 導入成本較高,需要考慮瀏覽器與裝置支援 |
| 生物辨識 | 你本身的特徵 | 快速、直覺 | 多半用於本機解鎖裝置或私鑰,不應被理解成網站直接保存你的生物特徵 |
其中,SMS OTP 或語音 OTP 雖然常見,但不是高安全場景的首選。攻擊者可能透過 SIM swap、電信社工、簡訊攔截,或語音信箱等傳遞通道取得驗證碼。因此,如果系統要保護的是管理後台、金融交易或敏感資料,通常會更建議使用 TOTP、WebAuthn / Passkey 或硬體安全金鑰。
📰 真實案例:LINE 帳號盜用與語音信箱預設密碼
2026 年 3 月 31 日晚間到 4 月 1 日,台灣出現一波 LINE 帳號遭盜用事件。數位發展部後續說明,台灣大哥大調查發現,受影響系統為供部分原台灣之星用戶使用的語音信箱;若用戶沒有修改預設密碼,外人可能透過手機號碼與預設密碼遠端聽取留言,進一步取得 LINE 的語音驗證碼。
流程可以簡化成:
攻擊者嘗試登入 LINE ↓ LINE 發送一次性驗證碼(OTP) ↓ 驗證碼透過語音方式進入語音信箱 ↓ 攻擊者用預設密碼遠端進入語音信箱 ↓ 聽到 OTP ↓ 完成登入驗證 ↓ 帳號被接管這個案例的重點不是「OTP 本身被破解」,而是 OTP 的傳遞通道被攻破。
也就是說,OTP 就算只有幾分鐘有效,只要攻擊者能同步取得它,仍然可以完成驗證。
這也是為什麼「有 OTP ≠ 一定安全」;安全性還取決於 OTP 是透過 SMS、語音電話、Email 還是 Authenticator App 傳遞,以及這些通道本身是否安全。
前面提到的 LINE 案例,說明了一件事:OTP 的有效時間再短,只要傳遞通道被攻破,攻擊者還是可能在有效時間內拿到它。所以接下來與其只問「有沒有 MFA」,更應該問的是:第二因素是怎麼送到使用者手上的?這條路安全嗎?
這時候就可以先認識一個比 SMS / 語音 OTP 更常見於 MFA App 的做法:TOTP(Time-based One-Time Password,基於時間的一次性密碼)。
TOTP 和 SMS / Email OTP 最大的差別在於:SMS / Email OTP 是伺服器產生一組驗證碼,再透過簡訊或 Email 傳給使用者;TOTP 則是在設定 MFA 時,伺服器和使用者的 Authenticator App 先共享一把 secret,之後雙方各自根據「共享 secret + 當前時間」計算出同一組 6 位數代碼。
也因為 TOTP 是靠時間同步產生,Authenticator App 不需要連上網路,也不需要等伺服器把驗證碼送過來。常見的 TOTP 代碼通常每 30 秒更新一次,過期後就會產生下一組。伺服器驗證時,會用同樣的 secret 和時間區間算出預期的代碼,再跟使用者輸入的代碼比對。
所以和 SMS、語音電話、Email OTP 相比,TOTP 少了一條「把驗證碼送到使用者手上」的傳遞通道,也就比較不容易受到簡訊攔截、語音信箱被入侵或 Email 被盜的影響。不過它仍然不是完美的:如果使用者把即時產生的 TOTP 輸入到釣魚網站,攻擊者仍可能在短時間內拿去完成登入。
理解 TOTP 的原理後,就可以把它放回完整登入流程裡看。
在一個啟用 TOTP MFA 的系統中,登入通常不是「輸入密碼就結束」,而是先完成帳密驗證,再進入第二因素驗證。下面這張圖把完整登入流程和 TOTP 的產生、驗證放在一起看:

整個流程可以拆成三個角色來看:
MFA 不是取代密碼,而是在「帳密驗證成功」之後,再多加一道確認本人身份的關卡。
TOTP 已經比 SMS / 語音 OTP 少了一條傳遞通道,但它仍然需要使用者手動切換 App、查看代碼、再輸入回網站。如果使用者被釣魚網站騙到,攻擊者也可能即時拿到這組代碼。
因此近年來更常被討論的是 WebAuthn / Passkey。它不需要使用者手動輸入六位數 OTP,而是透過裝置上的安全憑證與公私鑰機制完成驗證。使用者可能只需要用 Touch ID、Face ID 或裝置 PIN 解鎖,就能完成登入或第二因素驗證。
這裡要特別注意:指紋或臉部資料不會被送到網站伺服器。生物辨識通常只是用來在本機解鎖私鑰;伺服器實際驗證的是由私鑰產生的簽章。
如果把 TOTP 與 WebAuthn / Passkey 放在一起比較,差異會像這樣:
| 比較項目 | TOTP | WebAuthn / Passkey |
|---|---|---|
| 使用者動作 | 打開驗證器 App,手動輸入 6 位數代碼 | 使用 Touch ID、Face ID、裝置 PIN 或安全金鑰完成驗證 |
| 驗證依據 | 雙方共享的秘密與目前時間計算出的 OTP | 裝置私鑰簽章,伺服器用公鑰驗證 |
| 是否容易被釣魚 | 仍可能被即時釣魚網站騙走 OTP | 較能抵抗釣魚,因為憑證通常綁定網域 |
| 使用體驗 | 安全性不錯,但步驟較多 | 流程較短,使用者體驗較好 |
| 導入成本 | 相對低,支援度高 | 需要支援 WebAuthn / Passkey 生態與裝置相容性 |
💡 如果只看使用體驗,TOTP 和 Passkey 都是在「密碼之外」多加一道驗證;但從安全模型來看,兩者其實差很多。
TOTP 驗證的是一組短時間內有效的一次性代碼;Passkey / WebAuthn 驗證的則是由裝置私鑰產生的數位簽章,而且憑證通常會綁定特定網站網域。
因此,相較於 TOTP,Passkey / WebAuthn 對釣魚網站與驗證碼竊取的抵抗能力通常更強。
| 概念 | 說明 |
|---|---|
| MFA | 用兩種以上不同類型的證據,讓身份驗證更難被攻破 |
| 2FA | MFA 的一種特例,限定剛好使用兩種因素 |
| OTP | 一次性密碼,只能在短時間內使用一次 |
| TOTP | 基於時間的一次性密碼,常見於 Authenticator App |
| WebAuthn / Passkey | 透過公私鑰與裝置驗證完成登入或第二因素驗證,抗釣魚能力更好 |
今天先把「怎麼證明這是本人」講完了。不過驗證成功後,系統還要面對下一個問題:HTTP 本身是無狀態的,伺服器要怎麼在後續每一次請求裡,知道「這仍然是同一個已登入的使用者」?
下一篇會接著看幾種常見的 HTTP 驗證機制:Basic Auth、Digest Auth、API Key,以及 Session-based 登入。