Passkey
Passkey 的核心概念是用一組金鑰對取代共享秘密:服務端存公鑰,使用者的裝置保管私鑰,登入時由裝置對服務端送來的一段隨機值產生簽章。它的底層規格是 WebAuthn(FIDO2 的網頁認證標準),passkey 是這套規格搭配可跨裝置使用的憑證之後的產品名。服務端持有的那一份是公鑰,外洩不構成可還原的風險,於是 7.30 使用者密碼儲存 那一整套判讀(刻意放慢的雜湊、work factor、參數老化)對它不適用。它是 authentication 人類身分分支底下與密碼並列的一個選項,取捨見 7.31 認證方式選型。
概念位置
它擋掉的是兩類與共享秘密綁在一起的攻擊。Credential stuffing 失效的原因是沒有可重用的秘密——別處外洩的那些值在這裡沒有可以對上的秘密。釣魚失效的原因是簽章由瀏覽器綁在當下的網域上,釣魚站的網域不同就產不出可用的簽章,而這一項與使用者有沒有警覺無關。
它不處理的是私鑰所在那個實體的安全。裝置被取得、平台帳號被接管、註冊流程被繞過,這幾條路徑都不受簽章機制保護,判斷這幾條路徑要問的是那把憑證離不離得開它原本的實體,因為那決定了副本數量可不可知,判讀見 7.39 使用者持有型憑證。
生物辨識與它的關係常被顛倒。指紋與臉部特徵不離開裝置、也不送到伺服器,它們解鎖的是裝置上那把私鑰。所以憑證是私鑰,生物辨識是那把私鑰的鎖。
可觀察訊號與例子
同一個服務上會同時存在兩種形態,而使用者分不出自己手上是哪一種:憑證綁在單一裝置的安全區(不可導出、換裝置就沒有了),或隨平台帳號同步(換裝置無痛,而實際保護等於那個平台帳號的保護,它自己多半仍由密碼加第二因子守著)。形態由使用者的作業系統與瀏覽器組合決定,設計時要假設兩種都會出現。
導入之後判斷它實際擋掉了什麼,看的是還有哪些路徑進得來。密碼路徑仍然開著時,攻擊面由那條路徑決定,而採用率、登入失敗率這些指標量的是另一件事,兩者之間沒有關聯。
設計責任
這一類憑證偽造不了,於是攻擊者的最短路徑改成宣稱自己掉了——帳號回復路徑因此要在主路徑上線前設計完,安全上限跟著落在補發那條路上——補發若要求可猜測的材料(預設問題、寄到信箱的重設連結),上限就等於那份材料。降低這個壓力最有效的做法是要求註冊第二支憑證,讓遺失變成不便而非事故。
在已登入狀態下新增一支的做法,會讓新憑證的強度上限等於當次登入用的方式。密碼登入之後可以註冊憑證的系統因此有一條隱形路徑:攻擊者拿到密碼就能替自己註冊一支憑證,而它不會因為使用者改密碼而失效。處置是註冊時要求 step-up authentication、把註冊與撤銷事件通知使用者並寫進 audit log。
覆蓋率到什麼比例就關掉或降級密碼路徑,這個觸發條件要在導入當下寫下來。它缺席時實際下限不會移動,而拖得越久越難關。