前言
隨着人們對於個人信息安全越來越重視,用戶對APP安全要求也越來越高,尤其是金融類APP,很多都已支持指紋&3D登錄功能。相較於傳統登錄方法,指紋&3D面容登錄可省去輸入賬戶、密碼、驗證碼等環節,在最大限度地方便用戶的同時,也保證了用戶信息的私密。那么,如何讓自己的APP增加指紋/面容登錄功能呢?
只要接入HMS線上快速驗證服務(FIDO),即可幫助你的APP實現指紋&3D面容登錄功能。
HMS Core FIDO2 是個啥?
Fast Identity Online是一套身份鑒別框架協議。FIDO聯盟於2012年7月成立,至2019年5月已達251家,囊括業界領先廠商,技術規范包括UAF和U2F兩大系列,並推出FIDO 2.0項目。FIDO聯盟成員網址 https://fidoalliance.org/members/
FIDO成員舉例
FIDO (Fast Identity Online)規范旨在提供通用、安全、便捷的無密碼和多因子線上用戶身份驗證技術方案。支持應用於用戶登錄、轉賬支付等各種需要驗證用戶身份的場景。FIDO 2(讀音:“faìduo兔”或“faìdōu 兔”)規范定義了一個強大的身份驗證解決方案。
FIDO2典型的應用場景有如下三種:
- 指紋/3D面容登錄;
- 指紋/3D面容轉賬/支付;
- 雙因子認證;
本期我們將介紹第一個應用場景:指紋/3D面容登錄。在應用內登錄帳號時,不需要用戶輸密碼,只需要驗證指紋/3D面容即完成登錄,避免密碼、撞庫等安全風險。
場景演示
下方的Gif圖展示FIDO2如何完成指紋/3D面容登錄的過程。
HMS Core FIDO2 怎么做到的?
FIDO規范定義了一套在線身份認證的技術架構。其中,除了應用和應用服務器以外,還包括3個組件:FIDO認證器、FIDO客戶端和FIDO服務器。
-
FIDO認證器:用來進行本地認證的機制或設備,分為平台認證器和漫游認證器。在面向最終用戶時,認證器通常被稱為安全密鑰。
平台認證器:集成在使用FIDO的設備上的認證器,比如手機或筆記本電腦上基於指紋識別硬件的認證器。 -
漫游認證器:游離於使用FIDO的設備,通過藍牙、NFC或USB連接的認證器,比如形狀類似於U盾或動態令牌的認證器。
-
FIDO客戶端:集成在平台中(如Windows、MacOS和HMS Core)中,提供SDK給應用集成;或集成在瀏覽器中(如Chrome、Firefox和華為瀏覽器),提供JavaScript API給服務集成。FIDO客戶端是應用調用FIDO服務器和FIDO認證器完成認證的橋梁。
-
FIDO服務器:在應用服務器需要發起FIDO認證時,生成符合FIDO規范的認證請求,發送給應用服務器;並在FIDO認證器完成本地認證后,接收應用服務器返回的FIDO認證響應,並進行較驗。
FIDO規范定義了兩個主要流程:注冊和認證。從用戶登錄這個實際應用場景來說,注冊流程對應開通指紋/3D面容登錄的過程,認證流程對應使用指紋/3D面容完成登錄的過程。
在注冊流程中,FIDO認證器產生一對用戶公私鑰對作為認證憑據,私鑰存儲在FIDO認證器中,公鑰發送給FIDO服務器存儲。同時,FIDO服務器建立用戶和認證憑據的關聯關系,在認證流程中使用。
在認證流程中,FIDO認證器使用用戶私鑰對挑戰值進行簽名,FIDO服務器使用用戶公鑰驗證簽名,驗證通過即認為是合法用戶。
如何集成華為HMS Core FIDO2?
開發前准備
FIDO2的集成准備,超級簡單,除了接入HMS SDK必備的agc、maven和混淆等配置之外,只需加上FIDO2的編譯依賴即可,坐標如下:
implementation 'com.huawei.hms:fido-fido2:5.0.0.301'
開發(表格性的,錯誤碼、返回值、編譯依賴參考ML)
FIDO2分成兩個操作,注冊和認證,處理流程類似。關鍵過程代碼如下:
- 初始化一個Fido2Client實例
Fido2Client fido2Client = Fido2.getFido2Client(activity); - 調用Fido2Client.getRegistrationIntent()發起注冊。或調用Fido2Client.getAuthenticationIntent()發起認證。從FIDO服務器獲取挑戰值及相關策略,並組裝請求消息。(這里僅提供FIDO客戶端的API,涉及與FIDO服務器的交互,請參考相關規范,並聯系FIDO服務器供應商獲取相關接口說明。)然后調用Fido2Client.getRegistrationIntent()發起注冊。或調用Fido2Client.getAuthenticationIntent()發起認證。
在回調中調用Fido2Intent.launchFido2Activity(),啟動注冊(requestCode為Fido2Client.REGISTRATION_REQUEST)或認證(requestCode為Fido2Client.AUTHENTICATION_REQUEST)。該回調在主線程中執行。
fido2Client.getRegistrationIntent(registrationRequest, registrationOptions, new Fido2IntentCallback() {
@Override
public void onSuccess(Fido2Intent fido2Intent) {
fido2Intent.launchFido2Activity(XXXActivity.this, Fido2Client.REGISTRATION_REQUEST);
}
@Override
public void onFailure(int errorCode, CharSequence errString) {
Log.e("errorCode: "+ errorCode + ", errorMsg: " + errString);
}
});
- 在回調Activity.onActivityResult()中,調用getFido2RegistrationResponse()或Fido2Client.getFido2AuthenticationResponse()獲取注冊或認證的結果。
Fido2RegistrationResponse fido2RegistrationResponse = fido2Client.getFido2RegistrationResponse(data)
- 把注冊或認證的結果發送給FIDO服務器進行驗證。
(這里僅提供FIDO客戶端的API,涉及與FIDO服務器的交互,請參考相關規范,並聯系FIDO服務器供應商獲取相關接口說明,代碼略)
更多信息
華為開發者官網上也有相應的演示demo,示例代碼和開發文檔。
Github演示Demo和示例代碼:
https://github.com/HMS-Core/hms-FIDO-demo-java
華為FIDO2慕課視頻:
https://developer.huawei.com/consumer/cn/training/detail/101583008688294169
后期預告
基於線上快速身份驗證服務,下期聊聊FIDO2定制開發能力,認證器選擇策略、UI界面定制,后面還會有實戰經驗分享,大家可以持續關注~
原文鏈接:https://developer.huawei.com/consumer/cn/forum/topicview?fid=18&tid=0201315130192110308
原作者:別吃草莓