昨天介紹了 ROPC,說明為什麼 Client 不應直接取得使用者密碼。今天要看的 Passkey,則讓使用者不必輸入密碼,也能完成登入。
Day02 曾提過,Passkey 比密碼與 OTP 更安全。很多人以為這是因為 Passkey 會使用指紋或臉部辨識,但生物辨識只是用來解鎖裝置內的 Passkey,真正的核心是一組公開金鑰與私密金鑰。
登入時,服務端會送出每次都不同的 Challenge,裝置使用私密金鑰完成簽章,服務端再用公開金鑰檢查結果。由於私密金鑰不會被傳出去,之前的簽章也不能拿來重複登入,因此比密碼與 OTP 更能抵抗釣魚和重放攻擊。
本文會先介紹 Passkey 的註冊與登入流程,再比較它與密碼、靜態條碼及 TOTP 的差異,最後說明 Passkey 與 OpenID Connect、Device Authorization Grant 的關係。
今天內容涵蓋:
登入的目的,是向服務端證明「目前操作的人有權使用這個帳號」。不同登入方式,最大的差別在於這份證明如何送到服務端。
因此,真正的問題不只是內容會不會改變,而是登入時送出的資料能不能被複製後拿去冒用。
Passkey 改用一組公開金鑰與私密金鑰完成驗證:
登入時,服務端先送出一個每次都不同的 Challenge,裝置使用私密金鑰對它簽章,再把簽章結果送回去。服務端用公開金鑰驗證成功後,就能確認使用者持有正確的私密金鑰。
由於每次登入使用的 Challenge 都不同,這次產生的簽章無法拿到下一次登入重複使用。簡單來說,密碼登入像是把鑰匙交出去檢查;Passkey 則像是用鑰匙完成一次簽名,鑰匙本身不必交出去。
Passkey 必須先完成一次註冊,之後才能用來登入。這兩個流程可以簡單理解成:
圖中的 Relying Party 是提供登入功能的網站或服務;Authenticator 則是保存並使用 Passkey 的手機、電腦或安全金鑰。
流程中會反覆出現 Challenge。它是服務端在每次註冊或登入時臨時產生的一組隨機資料,裝置必須使用私密金鑰簽署這次的 Challenge,服務端才能確認裝置持有正確的私密金鑰。

對照上圖,流程如下:
challenge,並回傳使用者資料與其他必要設定。credential ID 回傳給服務端。credential ID 記錄在使用者帳號下。圖中省略了瀏覽器或 App 的傳遞過程,實際上會透過 WebAuthn API 與 Authenticator 溝通。

對照上圖,流程如下:
challenge,並回傳可使用的憑證資訊。challenge。credential ID送回服務端。credential ID 找到公開金鑰,再驗證簽章及其他必要資訊。藍牙不是所有 Passkey 登入都必須使用。若 Passkey 已同步到目前的電腦,或電腦本身保存該 Passkey,使用者可以直接在本機完成驗證,不需要手機或藍牙。
只有在 Passkey 儲存在手機,並透過電腦顯示的 QR Code 進行標準跨裝置登入時,才會使用 FIDO Hybrid Transport。QR Code 用來建立加密通道,藍牙低功耗(BLE)則用來確認手機與電腦確實位於附近;手機完成本機驗證及簽章後,再將結果傳回電腦。
🧪 可以用 Google 帳號實際測試: 在電腦的 Google 登入頁面選擇使用 Passkey,再選擇使用其他手機或平板,電腦便會顯示 QR Code。掃描前可以先故意關閉手機的藍牙;掃描後,系統會提示開啟藍牙服務。開啟藍牙並完成手機上的指紋、臉部辨識或 PIN 驗證後,電腦才會繼續登入。這個測試可以直接看出,BLE 在跨裝置 Passkey 登入中負責確認手機與電腦位於附近。
此外,每個服務網域與帳號使用的 Passkey 憑證彼此獨立,因此不同服務無法直接用公開金鑰辨認同一位使用者。
前面的流程說明了 Passkey「做了什麼」。實際運作時,網站、瀏覽器與 Authenticator 還需要依照共同標準交換資料,這套技術架構稱為 FIDO2,主要包含 WebAuthn 與 CTAP:
| 名稱 | 在流程中的作用 |
|---|---|
| WebAuthn | 定義網站或 App 如何透過瀏覽器/作業系統建立與使用 Passkey |
| CTAP | 定義瀏覽器/作業系統如何與安全金鑰、手機等外部 Authenticator 溝通 |
| FIDO2 | 統稱由 WebAuthn 與 CTAP 組成的整體技術架構 |
| Passkey | 建立在這套架構上的登入憑證,由瀏覽器或作業系統協助選取與使用 |
💡有些 Passkey 可以在使用者自己的多台裝置上使用。例如,假設你在 iPhone 上為某個網站建立 Passkey,並將它儲存在 iCloud Keychain。之後,只要你的 Mac 登入相同的 Apple 帳號並啟用 iCloud Keychain,這組 Passkey 就能同步到 Mac,讓你直接使用 Mac 的 Touch ID 登入同一個網站,不必重新建立 Passkey。同步過程會受到加密保護,網站仍然拿不到私密金鑰;登入時,網站收到的只有裝置產生的簽章結果。
密碼、靜態條碼、TOTP 與 Passkey 都可以用來確認登入者的身分,但它們交給服務端的資料不同,遭到竊取後的風險也不同。
| 登入方式 | 登入時交給服務端的資料 | 攻擊者取得後的風險 |
|---|---|---|
| 密碼 | 固定、可重複使用的密碼 | 可直接嘗試登入,直到密碼被更換 |
| 靜態條碼 | 條碼內固定的識別資料或憑證 | 如果條碼本身就是憑證,被拍照或複製後便可能遭到冒用 |
| TOTP | 短時間內有效的動態驗證碼 | 雖然會過期,攻擊者仍可能在有效期間內立即轉送使用 |
| Passkey | 針對當次 Challenge 產生的簽章 | 舊簽章無法用於下一次登入,而且 Passkey 會檢查服務網域 |
比較這些方式時,重點不是資料屬於「靜態」還是「動態」,而是攻擊者取得登入資料後,能不能直接拿去完成登入。
💡Passkey 跨裝置登入時顯示的 QR Code 並不是登入憑證,而是讓正在登入網站的電腦,與保存 Passkey 的手機建立一次性的加密連線。真正用來證明身分的,仍然是裝置使用私密金鑰產生的簽章;後面再說明它與 Device Authorization Grant 的差異。
Passkey、OpenID Connect(OIDC)與 Device Authorization Grant 分別解決不同問題,不是互相取代的登入方式。Passkey 負責讓使用者證明身分;OIDC 負責將登入結果交給應用系統;Device Authorization Grant 則讓輸入能力受限的裝置取得 Access Token。
當應用系統透過 OIDC 將使用者導向 IdP 登入時,IdP 可以要求使用者使用 Passkey 完成認證,再由 OIDC 把登入結果交回應用系統。
| 比較項目 | Passkey | OpenID Connect |
|---|---|---|
| 解決的問題 | 使用者如何證明自己有權登入帳號 | 應用系統如何取得使用者的登入結果 |
| 主要做法 | 裝置使用私密金鑰簽署 Challenge | IdP 透過 Authorization Code Flow 發出 ID Token |
| 取代的對象 | 可取代密碼或 OTP 等登入方式 | 不取代 Passkey,使用者在 IdP 完成 Passkey 驗證後,OIDC 再把身分結果交給應用系統 |
假設一個應用系統使用 OIDC 串接公司 IdP,並讓使用者用 Passkey 登入,流程如下:
Device Authorization Grant 常用於 Smart TV 等輸入能力受限的裝置,讓使用者改在手機或電腦上完成登入與授權。它和 Passkey 跨裝置登入都可能顯示 QR Code,但兩者位於不同的協定層,QR Code 的用途也不同:
| 比較項目 | Passkey 跨裝置登入 | Device Authorization Grant |
|---|---|---|
| 所在層級 | WebAuthn/FIDO2 的認證(Authentication)層,登入這一步本身 | OAuth 2.0 的授權(Authorization)層,一個 Grant Type |
| 解決的問題 | 讓私密金鑰放在手機上時,另一台裝置能證明使用者確實握有這把金鑰 | 讓沒有瀏覽器、輸入能力受限的裝置換到 Access Token |
| 裝置顯示的內容 | 一次性、有時效性的連線用 QR Code | verification_uri + user_code(文字代碼,也可包成 QR Code) |
| 另一台裝置做的事 | 手機使用已保存的 Passkey,為這次登入產生簽章 | 開瀏覽器輸入代碼、用原本的登入方式(密碼/OTP/Passkey 都可以)登入並同意授權 |
| 主裝置怎麼拿到結果 | 使用 FIDO Hybrid Transport 時,驗證結果會透過加密通道直接傳回;BLE 只負責確認手機與電腦位於附近,不需要輪詢 | 輪詢 Token Endpoint,依 interval 反覆查詢 |
| 主要防禦手法 | 透過 BLE 確認電腦與手機位於附近,降低遠端轉送攻擊的風險;私密金鑰不會傳給電腦 | 代碼時效、限制輪詢頻率、防 Device Code Phishing |
例如 Smart TV 可以透過 Device Flow,讓使用者改在手機瀏覽器完成登入;如果使用者在手機上選擇 Passkey,Passkey 負責證明使用者身分,Device Flow 則負責讓電視取得 Access Token。
Passkey 的安全性核心是公開金鑰密碼學與 Challenge-簽章機制:
credential ID。下一篇將進一步拆解 Passkey 背後的技術架構,說明 FIDO2、WebAuthn 與 CTAP 分別負責什麼,以及網站、瀏覽器/作業系統與 Authenticator 如何共同完成註冊與登入。