在過去五天,我們深入研讀了 FIDO/WebAuthn 這部精密的「數位信任架構」。我們理解了它的基本原則(公鑰密碼學)、核心角色(RP, Authenticator),以及兩大核心儀式(註冊與驗證)。
今天我們要把腦中對理論的理解,轉化為一張張具體、可執行的建築藍圖。這份藍圖將指導我們在接下來的幾週內,如何安全、高效地建造出我們的次世代身分認證系統。
在敲下第一行程式碼之前,我們必須先回答一個問題:「我們的系統由哪些部分組成?它們之間如何溝通?」
我們的系統主要由以下幾個關鍵組件構成:
從圖中可以看到,無論是 Web 或是 App,所有的核心驗證邏輯都收斂在後端(Firebase Functions),確保了安全策略的統一與集中管理。
資料庫是我們「信任」的最終儲存地。一個清晰、安全的資料庫結構是專案成功的基石。基於 Firestore 的 NoSQL 特性,我們設計如下的集合(Collections)與文件(Documents)結構:
1. users
集合
這個集合用來儲存使用者的基本資訊。
users/{userId}
email
: (String) 使用者的電子郵件,用於登入識別。displayName
: (String) 使用者的顯示名稱。createdAt
: (Timestamp) 帳號建立時間。2. credentials
子集合
這是 FIDO 的核心!每個使用者文件底下,都會有一個 credentials
子集合,用來存放該使用者註冊過的所有驗證器憑證。一個使用者可以擁有多個憑證(例如,一台筆電的 Touch ID 和一個 YubiKey)。
users/{userId}/credentials/{credentialId}
publicKey
: (String) 使用 CBOR 編碼後再轉為 Base64 的公鑰字串。這是驗證簽章的關鍵。signCount
: (Number) 簽章計數器。極其重要,用於防止憑證複製攻擊。初始值為 0。transports
: (Array of Strings) 記錄驗證器的類型,例如 ["internal"]
或 ["usb", "nfc"]
。這有助於後續的登入流程優化。createdAt
: (Timestamp) 憑證註冊時間。lastUsedAt
: (Timestamp) 上次使用時間。這樣的設計將使用者資料與 FIDO 憑證清晰地分開,同時利用子集合的特性,讓查詢特定使用者的所有憑證變得非常高效。
一套沒有經過安全審視的架構,就像一棟地基不穩的大樓。現在,我們要戴上駭客的帽子,使用微軟開發的 STRIDE 模型來主動找出系統的潛在威脅,並檢視我們的 FIDO 架構是否能有效應對。
STRIDE 是六種安全威脅類型的縮寫:
威脅類型 | 描述 | 我們的 FIDO 架構如何應對? |
---|---|---|
Spoofing (身分偽冒) | 攻擊者冒充他人身分。 | 極強防禦:私鑰不出設備,攻擊者無法偽造數位簽章。WebAuthn 的 origin 綁定機制從協議層面防止了釣魚網站的偽冒攻擊。 |
Tampering (資料竄改) | 攻擊者惡意修改傳輸中的數據。 | 極強防禦:所有關鍵數據(如 clientDataJSON )都被包含在數位簽章的計算範圍內。任何一個位元的竄改都會導致後端簽章驗證失敗。 |
Repudiation (否認) | 使用者否認自己執行過某項操作。 | 極強防禦:基於私鑰的數位簽章具有法律上的不可否認性。只要簽章驗證通過,就能強力證明該操作確實由私鑰持有者發起。 |
Information Disclosure (資訊洩漏) | 系統的敏感資訊被洩漏。 | 極強防禦:我們的資料庫只儲存公鑰。即使整個資料庫被盜,攻擊者也無法從公鑰反推出任何私鑰,因此無法冒用使用者身分。這是相較於密碼雜湊儲存的最大優勢。 |
Denial of Service (服務阻斷) | 讓合法使用者無法使用服務。 | 中等防禦:這通常是基礎設施層面的問題。我們依賴 Firebase 平台提供的防護。應用層面,我們可以為 API 端點設置速率限制 (Rate Limiting) 來緩解攻擊。 |
Elevation of Privilege (權限提升) | 攻擊者獲得了超出其應有權限的能力。 | 職責分離:FIDO/WebAuthn 專注於認證 (Authentication),即「你是誰」。而權限管理屬於授權 (Authorization) 的範疇,應在後端業務邏輯中嚴格控管。我們的架構確保了認證和授權的分離。 |
通過 STRIDE 分析,我們可以充滿信心地說,我們選擇的 FIDO 架構在核心的身分安全威脅上,提供了業界頂尖的防護能力。
最後,我們將上述設計收斂成一份清晰的後端 API 規格。這將是我們下週後端開發的「施工圖」。
註冊流程 API
POST /generate-registration-options
{ "email": "user@example.com", "displayName": "User Name" }
PublicKeyCredentialCreationOptions
物件。POST /verify-registration
{ "email": "user@example.com", "credential": { ...PublicKeyCredential } }
{ "verified": true }
驗證流程 API
POST /generate-authentication-options
{ "email": "user@example.com" }
PublicKeyCredentialRequestOptions
物件。POST /verify-authentication
{ "email": "user@example.com", "assertion": { ...PublicKeyCredential } }
{ "verified": true, "token": "YOUR_JWT_OR_SESSION_TOKEN" }
今天,我們完成了從抽象理論到具體實踐的關鍵一步,設計了核心的資料庫結構,用嚴謹的威脅模型審視了其安全性,並最終產出了一份清晰的 API 實作藍圖。
我們不再只是「知道」FIDO 是什麼,而是「知道」我們要如何打造一個基於 FIDO 的安全系統。
第一週的理論基石已經奠定完成。從明天開始,我們將進行第一週的總回顧。下週,我們將捲起袖子,在 Firebase 的雲端環境中,鑄造我們系統的第一個信任錨點——後端 API!