前情提要:
WWDC22 雖然說是 Apple 的開發者大會,但是當天在看 Keynote 的時候,這個 Passkeys 的功能卻讓我相當的驚喜。 於是等到整個細節的議程 Meet passkeys 的議程 ,整個議程帶來許多新的想法。於是認真的的研究一下,原來 Apple 在 WWDC 21 就已經開發出來 Passkey 的相關流程跟開發方式(參考 WWDC21 議程: Move beyond passwords)。但是到了 iOS16 才有原生支援在手機與 iOS App 端。
認證 (Authentication) 的方式到底有幾種?
Passkey 是一個溝通協定,可以比起舊的 Password 機制來說更佳的安全。現在的認證有以下幾種:
- Memorized passwords:
- 就是輸入 ID, PW 的方式。然後用人力來記錄。非常危險,因為經常怕忘記而全部使用同一個。
- Password manager:
- 舉凡 Apple/Chome AutoFill 都算是,這時候你可能不需要紀錄密碼(甚至會幫你產生一組密碼)。但是困擾點就是很難跨系統,甚至只是跨 browser 使用。
- Security Key:
- 很多市售的 USB Security Key (也可以用其他傳輸方式),可以直接透過 Security Key 登入一些網站。
以上幾種的相關安全度,可以看一下 WWDC 提出的整理。
(From:WWDC21 議程: Move beyond passwords )
(from WWDC22 Session: Meet passkeys)
什麼是 Passkeys ?
Passkey:
- 最新提出的 Passkey 則是透跟 WebAuthn 與 FIDO2 的認證方式。
(Edit on PlantText)
這只是一個簡單的技術整理圖, Passkeys 透過了 FIDO2 與 WebAuthn 的方式來整合。並且因為在 iOS 整個生態系統上有了更多的應用。
- 原生支援在 iOS16 App 跟 Safari (iOS15 的 Safari 就可以,只是 App 端還不支援)
- 可以使用 iCloud 備份(這邊也是很多開發者說,唯一不安全點)
- 可以把 Passkeys 分享給其他信任的人。
整個流程 (參考What is WebAuthn? How to Authenticate Users Without a Password) 如上:
註冊
- 使用者透過瀏覽器(User Agent) 登入網站(Relying Party),要求認證。
- 按下登入資料
- 瀏覽器透過 WebAuthn 開啟驗證
- 可以是 Touch ID, Face ID 或是 YubiKey
- Yubikey / FaceID / Touch ID 產生 public key
- 傳輸 Public Key 到伺服器端儲存
- 註冊完成
登入驗證(Sign-in)
- 使用者按下登入
- 收到網站透過該使用者的 Public 產生的 Challenge
- 透過使用這本地端的 Private Key 解開該 Challenge 並且回傳答案
- 伺服器驗證後,確認無誤確認使用者登入。
(2022/12/10更新)如果是第一次創建帳號,需要幾次手續? 為什麼?
請參考這篇文章 [TIL] 為什麼 Passkeys 流程在建立帳號的時候,依舊需要帳號跟密碼?
身為後端開發者,你該怎麼應用 WebAuthn?
要導入 Passkeys 須要導入以下相關流程:
- FIDO2 套件
- 透過 WebAuthn 開發伺服器相關套件
講到 WebAuthn 的套件就會先看到 https://github.com/duo-labs/webauthn,使用方式如下:
- 嚐鮮: https://webauthn.io/
- 使用 Auth Type:
- Cross Platform 就是 Securrity Key
- Platform (TPM) 就是透過 FIDO2
- 使用 Auth Type:
- 開源套件: https://github.com/duo-labs/webauthn
把 WebAuthn 當成 SaaS 的 HANKO
聽起來有點麻煩,不過有看到有一家公司 HANKO 有相關的 SaaS API 服務(免費應該很夠用),可以參考 Passkeys for web authentication 這篇文章,裡面也有一個 Open Source 套件可以用。
Golang 上開發 WebAuthn 與 Passkey
https://github.com/teamhanko/apple-wwdc21-webauthn-example
他也有給出範例網站,如果你想直接玩的話。
(link: https://apple-passkey.demo.hanko.io/)
有點想把它改成其他版本,好像也沒有完整一整套整理的流程。 其實就流程上,真的還有一點麻煩。 除了要存使用者名稱外,還要把 Public Key 存起來備用。 雖然使用者相當簡單,但是後端開發者其實要用的東西還真不少。
結語:
Passkey 是去年 WWDC 就提出的 Passwordless 的解決方案,不僅僅可以把密碼交易金鑰產生放在手機上,更可以讓登入變成簡單而快速。 開啟了未來網站與服務新的認證方式,但是整個開發流程在伺服器端還是相當的繁瑣,許多各大網站的 OpenID 也沒有支援。 如果未來能支援的網站越來越多,相信真正 Passwordless 的日子就會來臨。
這幾個範例,這次先不提開發的部分。 我來玩個幾天弄個快速部署版本給大家吧!
Reference
- Apple Doc: Supporting Passkeys
- WWDC22 Session: Meet passkeys
- WWDC21 議程: Move beyond passwords
- FIDO2: Web Authentication (WebAuthn)
- Passkeys for web authentication
- What Apple’s WWDC Passkeys Announcement Means for Enterprise IAM
- https://github.com/duo-labs/webauthn
- WebAuthn.io: A demo of the WebAuthn specification
- What is WebAuthn? How to Authenticate Users Without a Password