使用 WebAuthn 啟用高強度驗證

問題

網路釣魚是網路上最重大的安全性問題:去年,駭客相關帳戶侵害事件中,有 81% 曾使用低強度或遭竊的密碼。業界普遍對這個問題的共識是多因素驗證,但實作過程變得零散,大多數仍無法妥善處理網路釣魚問題。我們自 2013 年起便與 FIDO 聯盟合作,更近期更與 W3C 合作,共同實作了可防範網路詐騙的標準化通訊協定,任何網頁應用程式都能使用。

什麼是 WebAuthn?

Web Authentication API 可讓網頁應用程式透過使用者代理程式,透過驗證器進行存取。驗證器通常是透過 USB/BLE/NFC 存取的硬體權杖,或是直接內建於平台的模組,以便產生並有挑戰性的應用程式限定範圍 (eTLD+k) 公開金鑰憑證。這可實現多種用途,例如:

  • 低阻礙和可防範網路釣魚的 2FA (可與密碼搭配使用)。
  • 無密碼、以生物特徵辨識為基礎的重新授權。
  • 「不需要」密碼的 2FA 是一種低阻礙和可防範網路釣魚的 2FA,可用於無密碼帳戶。

這個 API 預計會由大多數主要瀏覽器實作,目標是簡化必須線上驗證身分並大幅減少網路詐騙時的使用者介面。

WebAuthn 擴充 Credential Management API,並新增名為 PublicKeyCredential 的新憑證類型。WebAuthn 簡化瀏覽器與驗證器之間的通訊,讓使用者可以:

  1. 建立並註冊網站的公開金鑰憑證。
  2. 證明擁有對應私密金鑰的持有者,向網站進行驗證。

Authenticator 是可產生私密/公開金鑰組的裝置,並收集相關同意聲明。只要簡單輕觸畫面、成功讀取指紋資料,或其他方法,只要符合 FIDO2 規定 (有 FIDO 聯盟提供的認證計畫),即可授予簽署同意聲明。Authenticator 可內建於平台 (例如智慧型手機的指紋掃描器),或透過 USB、藍牙低功耗 (BLE) 或近距離無線通訊 (NFC) 連接。

運作方式

建立金鑰組並註冊使用者

使用者想註冊網站的憑證時 (WebAuthn 稱為「依賴方」):

  1. 依賴方產生挑戰。
  2. 依賴方透過 Credential Manager API 要求瀏覽器為依賴方產生新憑證,並指定裝置功能,例如裝置是否提供自己的使用者驗證 (使用生物特徵辨識等)。
  3. 驗證器取得使用者同意聲明後,會產生金鑰組,並將公開金鑰和選用的已簽署認證傳回網站。
  4. 網頁應用程式會將公開金鑰轉送至伺服器。
  5. 伺服器會儲存公開金鑰以及使用者身分,以便記住憑證以供日後驗證時使用。
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

驗證使用者

當網站需要取得與正確使用者互動的證明時:

  1. 依賴方產生驗證問題,並為瀏覽器提供已註冊使用者的憑證清單。還能指出要在哪裡尋找憑證,例如本機內建驗證器,或以 USB、BLE 等方式在外部驗證器上。
  2. 瀏覽器要求驗證器簽署驗證。
  3. 如果驗證器包含其中一個指定的憑證,驗證器會在收到使用者同意聲明後,將已簽署的宣告傳回網頁應用程式。
  4. 網頁應用程式將已簽署的斷言轉送至伺服器,讓依賴方進行驗證。
  5. 一旦伺服器進行驗證,驗證流程就會視為成功。
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

前往 https://webauthndemo.appspot.com/ 親自試用 WebAuthn。

接下來呢?

Chrome 67 Beta 版隨附支援 navigator.credentials.get({publicKey: ...})navigator.credentials.create({publicKey:... }),並允許在電腦上透過 USB 傳輸使用 U2F/CTAP 1 驗證器。

日後推出的版本將支援更多傳輸方式,例如 BLE 和 NFC,以及新版 CTAP 2 傳輸通訊協定。我們正在開發支援 CTAP 2 和 WebAuthn 的進階流程,例如受 PIN 保護的驗證器、選取本機帳戶 (而不輸入使用者名稱或密碼),以及指紋註冊。

請注意,Microsoft Edge 也支援這個 APIFirefox 自 Firefox 60 起支援 WebAuthn

資源

我們正在著手提供更詳細的說明文件:

在 2018 年 Google I/O 大會上,「網路註冊和登入新功能的最新消息」一節涵蓋 WebAuthn。