根據(jù)Verizon《2019數(shù)據(jù)泄露調(diào)查報告》顯示,超過80%的數(shù)據(jù)泄露都利用了被盜密碼或者是弱密碼,因此,近年來,微軟和谷歌一直在積極推動無密碼身份驗證,無密碼身份驗證技術(shù)在未來幾年可能變得更為普遍。
什么是WebAuthn
WebAuthn(Web 身份驗證)是由萬維網(wǎng)聯(lián)盟(W3C)發(fā)布的 Web 標準。WebAuthn 是 FIDO 聯(lián)盟指導下的 FIDO2 項目的核心組成部分。該項目的目標是標準化用戶對基于 Web 的應用程序和服務的公鑰認證的接口。
WebAuthn全稱Web Authentication API 使用asymmetric (public-key) cryptography (不對稱加密)替代密碼或SMS文本在網(wǎng)站上注冊、驗證, second-factor authentication(雙因素驗證)解決了phishing(釣魚)、data breaches(數(shù)據(jù)破壞)、SMS 文本攻擊及其它雙因素驗證等重大安全問題。同時顯著提高易用性(因為用戶不必管理許多越來越復雜的密碼)。
WebAuthn支持的生物驗證方式包括:筆記本電腦的指紋識別和面部識別、安卓設(shè)備的指紋識別。追求高安全的用戶還可額外購買兼容FIDO的實體安全密鑰,F(xiàn)IDO完整支持包括:指紋識別、面部識別、虹膜識別、聲音識別、實體密鑰(USB連接、藍牙連接、NFC連接),支持設(shè)備系統(tǒng)包括:Windows 10、Linux、Mac OS、Android、iOS、智能手表等。
支持系統(tǒng)和瀏覽器包括:
Windows:Edge,Firefox,Chrome;
Linux :Firefox,Chrome;
MacOS :Safari,Firefox,Chrome;
Android:Firefox,Chrome;
iOS :Brave,Firefox,Chrome;
Windows上的Microsoft Edge,使用Windows Hello(帶面部識別,指紋識別器或PIN) MacOS上的Chrome使用Touch ID指紋識別器 Android上的Chrome,使用指紋識別器。
WebAuthn的架構(gòu)實現(xiàn)
WebAuthn用公鑰證書代替了密碼,完成用戶的注冊和身份認證(登錄)。它更像是現(xiàn)有身份認證的增強或補充。為了保證通信數(shù)據(jù)安全,一般基于HTTPS(TLS)通信。在這個過程中,有4個模塊。
Server(服務端):
它可以被認為是一個依賴方(Relying Party),它會存儲用戶的公鑰并負責用戶的注冊、認證。
JavaScript(Js腳本):
調(diào)用瀏覽器API,與Server進行通信,發(fā)起注冊或認證過程。
Browser(瀏覽器):
需要包含WebAuthn的Credential Management API提供給js調(diào)用,還需要實現(xiàn)與認證模塊進行通信,由瀏覽器統(tǒng)一封裝硬件設(shè)備的交互。
Authenticator(認證模塊):
它能夠創(chuàng)建、存儲、檢索身份憑證。它一般是個硬件設(shè)備(智能卡、USB,NFC等),也可能已經(jīng)集成到了你的操作系統(tǒng)(比如Windows Hello,MacOS的Touch ID等)。
注冊流程
應用請求注冊
應用程序發(fā)出注冊請求,服務端提供api由前端js調(diào)用發(fā)起注冊請求;
服務端返回注冊數(shù)據(jù)
服務器將挑戰(zhàn)碼、用戶信息和依賴方信息發(fā)送回應用程序;
challenge:挑戰(zhàn)碼必須是隨機的 buffer(至少 16 字節(jié)),并且必須在服務器上生成以確保安全;
user info:用戶信息,服務端需要知道當前誰來注冊,正常應用場景中,第一步需要在其他輔助認證的情況下獲取當前合法用戶信息,比如第一步傳輸靜態(tài)用戶名密碼來做一次校驗,服務器認可當前是一個合法用戶請求注冊;
relying party info:服務端上下文,包含Authenticator Attestation Response中的 Public Key Credential。
瀏覽器調(diào)用認證器
請求認證器創(chuàng)建認證證書,瀏覽器生成客戶端數(shù)據(jù)(client Data)生成client Data Hash(由挑戰(zhàn)碼,服務端上下文 的 SHA-256 哈希)傳輸給認證器。
認證器創(chuàng)建密鑰對
認證器通常會以某種形式要求用戶確認密鑰器的所屬,如輸入 PIN、使用指紋、進行虹膜掃描等,以證明用戶在場并同意注冊。驗證通過后,認證器將創(chuàng)建一個新的非對稱密鑰對,并安全地存儲私鑰以供將來驗證使用。公鑰則將成為證明的一部分,被在制作過程中燒錄于認證器內(nèi)的私鑰進行簽名。這個私鑰會具有可以被驗證的證書鏈。
認證器數(shù)據(jù)返回瀏覽器
返回數(shù)據(jù)包括新的公鑰、全局唯一的憑證ID和認證憑證數(shù)據(jù)(Attestation object l包含F(xiàn)IDO的元數(shù)據(jù))會被返回到瀏覽器。
瀏覽器打包數(shù)據(jù),發(fā)送到服務端
包含公鑰,全局唯一的憑證ID、認證憑證數(shù)據(jù)、客戶端數(shù)據(jù)(client Data);其中認證憑證數(shù)據(jù)包含了client Data Hash,可以確定當前生成的公鑰是分配給當前請求注冊的用戶。
服務端完成注冊
收到客戶端發(fā)送的注冊請求,服務器需要執(zhí)行一系列檢查以確保注冊完成且數(shù)據(jù)未被篡改。步驟包括:
a.驗證接收到的挑戰(zhàn)與發(fā)送的挑戰(zhàn)相同;
b.確保 origin 與預期的一致;
c.使用對應認證器型號的證書鏈驗證 client Data Hash 的簽名和驗簽;
驗證步驟的完整列表可以在 WebAuthn 規(guī)范中找到。一旦驗證成功,服務器將會把新的公鑰與用戶帳戶相關(guān)聯(lián)以供將來用戶希望使用公鑰進行身份驗證時使用。
認證流程
應用請求認證
應用程序發(fā)出注冊請求,服務端提供api由前端js調(diào)用發(fā)起注冊請求;
服務端返回挑戰(zhàn)碼
挑戰(zhàn)碼必須是隨機信息(例如超過100字節(jié))的大緩沖區(qū),并且必須在服務器上生成挑戰(zhàn)碼,以確保身份驗證過程的安全。
瀏覽器調(diào)用認證器
瀏覽器生成客戶端數(shù)據(jù)(client Data)生成client Data Hash(由挑戰(zhàn)碼,服務端上下文 的 SHA-256 哈希)傳輸給認證器。
認證器創(chuàng)建斷言
認證器提示用戶進行身份認證(如輸入 PIN、使用指紋、進行虹膜掃描等),并通過在注冊時保存的私鑰對client Data Hash和認證數(shù)據(jù)進行簽名創(chuàng)建斷言。
認證器數(shù)據(jù)返回瀏覽器
返回認證數(shù)據(jù)和簽名到瀏覽器。
瀏覽器打包數(shù)據(jù),發(fā)送到服務端
包含客戶端數(shù)據(jù)(client Data)、認證數(shù)據(jù)和簽名到瀏覽器。
服務端完成注冊
收到瀏覽器發(fā)送的認證請求,服務器需要執(zhí)行一系列檢查以確保認證完成且數(shù)據(jù)未被篡改,步驟包括:
a.使用注冊請求期間存儲的公鑰驗證身份驗證者的簽名。
b.確保由身份驗證程序簽名的挑戰(zhàn)碼與服務器生成的挑戰(zhàn)碼匹配。
c.檢查賬號信息,是否是服務端的存在的賬號。
在WebAuthn規(guī)范中可以找到驗證斷言的完整步驟列表。假設(shè)驗證成功,服務器將注意到用戶現(xiàn)在已通過身份驗證。這超出了WebAuthn規(guī)范的范圍,但有一個選項是為用戶會話刪除一個新的cookie。
WebAuthn的應用場景
WebAuthn提供了一個安全的無密碼認證標準,徹底拋棄了密碼,并且統(tǒng)一由操作系統(tǒng)完成安全硬件設(shè)備和生物特征識別的集成及管理,瀏覽器調(diào)用操作系統(tǒng)進行提供的能力形成認證器,應用開發(fā)者按標準與瀏覽集成即可完成FIDO認證,無需關(guān)心硬件設(shè)備的兼容和生物特征的算法,使得應用開發(fā)者集成FIDO認證拋棄密碼更加容易和安全。
場景一:集成Windows hello認證
Win10系統(tǒng)的Windows hello模塊,本身可以集成人臉、指紋、pin碼等認證方式,在windows上運行的web應用注冊或認證時可以通過瀏覽器直接與windows hello集成獲取用戶身份憑證進行認證;
場景二:集成MacOS Touch ID認證
MacBook系統(tǒng)自帶Touch ID集成指紋認證,瀏覽器通過接口可以直接喚醒mac的Touch ID進行認證;支持Webauthn的web應用可以直接使用TouchID進行登錄;
場景三:集成Android指紋認證
由于Android系統(tǒng)廠商的異構(gòu),不同手機廠商會有不同的人臉識別或指紋識別模塊,通過Webauthn由系統(tǒng)層面封裝了與生物設(shè)備對接,應用系統(tǒng)就無需關(guān)心Android系統(tǒng)的異構(gòu)行,直接使用手機的生物認證登錄;
場景四:集成iOS人臉認證
iPhone系統(tǒng)自帶Face ID集成人臉認證,瀏覽器通過接口可以直接喚醒Face ID進行認證;支持Webauthn的web應用可以直接使用Face ID進行登錄;
場景五:使用YubiKey認證
YubiKey是一個外置的ukey存儲用戶私鑰來進行webauthn認證,其可以同時支持pc和移動app;pc模式下通過usb接口訪問,移動app模式下通過nfc訪問。
WebAuthn存在的缺點
WebAuthn依賴于瀏覽器與認證模塊通訊,那么必須使用最新的瀏覽方可支持。在無瀏覽器情況下如CS應用或移動APP無法簡便的使用;
WebAuthn設(shè)計的目標是解決認證,用戶一旦通過認證,就可以訪問所有資源,在零信任架構(gòu)中不能允許一次認證永久使用的場景存在。
Gartner的分析師Ant Allan最近通過無密碼認證的研究預測,到2022年,預計將有60%的大型和全球企業(yè)以及90%的中型企業(yè)將在50%以上的用例中實現(xiàn)無密碼認證。