今年三月四號 W3C 正式將 WebAuthn 列入正式標準中,WebAuthn 是 FIDO2 標準中構成核心的一部份,以 Web-based API 的方式讓網站可以將他們的登入頁加入瀏覽器及平台所支援的 FIDO 驗證。一般我們所使用的密碼登入機制屬於單一認證,一旦被盜取密碼便很容易被控制帳號存取權,然而根據 2017 年的統計,只有28%的使用者使用二階段認證(包括簡訊認證、Google Auth…等等)。WebAuthn 提供另一種免密碼、具高安全性驗證方式的選擇。開發者可透過 API 啟動 FIDO2 驗證,透過行動裝置、指紋辨識或是硬體安全金鑰登入帳號而不需要密碼,提供使用者除了密碼登入以外的便利選項。
在 WebAuthn 中加密方式採用 Public-Key Cryptography(Asymmetric Cryptography):利用一組非對稱的加密金鑰,使用者持有 private key & 服務端持有的 public key(credential)驗證使用者身分。(圖片來源: Public-key cryptograhphy)
當應用程式要求註冊或登入,使用 FIDO2 的 Relying Party APP Server 會告知瀏覽器現在需要使用 FIDO Authentication,瀏覽器會使用 WebAuthn API 透過 CTAP Protocol (Client to Authenticator Protocol)與 Authenticator 溝通,存取到需要的資訊並產生 public key 傳回服務端。CTAP 比過去的 FIDO 標準還要具備擴展性,使 mobiles 設備或 FIDO 安全金鑰可配合支援 WebAuthn 的瀏覽器使用,也可做為 Desktop app 及 Web service 的身分驗證器。
而 Relying Party APP Server 指的是負責註冊&認證 user 的組織或服務;Authentication 指的是 例如 TouchID、YubiKey 這些機制,前者存在設備內部的稱為 Platform type,後者這種外部硬體設備稱為 Cross-platform type。
WebAuthn 具備高安全性:每個網站都有獨立的加密登入憑證,保存在 user 的裝置中,不會存在任何伺服器上。迴避掉釣魚、帳密被盜、Replay Attack 等等問題。
- Authentication 以安全性硬體,儲存 Private Key 和 WebAuthn 所需的加密運算。
- Credential key-pair 綁定網域,使用者未余指定網域下才能存取。
- Public key 由可信的 Authenticators 產生。
介紹完 WebAuthn,我們來看一些 API 的使用方式,根據 Duo 的 Webauthn 指南,使用 Web Authentication API Authentication API 註冊的程式碼如下:
navigator.credentials.create() 提供給伺服器產生用戶端的憑證。
publicKeyCredentialCreationOptions 物件中有許多項目(必填/選填) ,用以產生使用者的憑證。
challenge:由 Server 端產生,存取一列隨機加密 bytes 的 Buffer,必須要能預防 Replay Attack。
rp:Relying Party 的縮寫,意指為使用者認證及認證的網站,id 必須是當下的 domain。
user:此欄內容是當下註冊的使用者資訊,Authenticator 使用此欄的 id 進行身分驗證,此欄資訊可能會儲存在 Authenticator 中,因此建議避免使用包含個人隱私的資料當作 id。
pubKeyCredParams:描述 Server 支援的 public key types 的陣列。
authenticatorSelection:此物件可選填,限制 RP 支援的 Authenticator 種類。
timeout:若使用者未在此欄限定的時間內回應 prompt,則回傳認證失敗。單位為 ms。
attestation:此物件可選填,指由 Authenticator 回傳,可追蹤使用者的資料,伺服器以內容決定 attestation data 的比重。總共有三種值:”none”、”indirect”、”direct”;none 代表此項資料不予以參考,indirect 代表只拿匿名資料,direct direct 代表要求要求 Authenticator 回傳所有 attestation data。