概述
人臉身份驗證允許用戶通過查看設備正面來解鎖設備。 Android 10 增加了對新的人臉身份驗證堆棧的支持,該堆棧可以安全地處理相機幀,在支持的硬件上進行人臉身份驗證期間保護安全性和隱私。 Android 10 還為符合安全要求的實現提供了一種簡單的方法,以支持交易應用程序集成,例如在線銀行或其他服務。
Android 人臉身份驗證堆棧是 Android 10 中的新實現。新實現引入了IBiometricsFace.hal
、 IBiometricsFaceClientCallback.hal
和types.hal
接口。
建築學
BiometricPrompt API 包括所有生物特徵認證,包括面部、手指和虹膜。 Face HAL 與以下組件交互。
人臉管理器
FaceManager
是一個私有接口,它與FaceService
保持連接。 Keyguard 使用它通過自定義 UI 訪問面部身份驗證。應用程序無權訪問 FaceManager,必須改用BiometricPrompt
。
人臉服務
這是管理對面部認證硬件的訪問的框架實現。它包含基本的註冊和身份驗證狀態機以及各種其他幫助程序(例如,枚舉)。出於穩定性和安全性考慮,不允許任何供應商代碼在此過程中運行。所有供應商代碼都通過Face 1.0 HIDL 接口訪問。
面對
這是一個 Linux 可執行文件,它實現了FaceService
使用的 Face 1.0 HIDL 接口。它將自己註冊為 IBiometricsFace@1.0 以便FaceService
可以找到它。
執行
人臉 HIDL
要實現人臉 HIDL,您必須在特定於供應商的庫中實現IBiometricsFace.hal
的所有方法。
錯誤信息
錯誤消息由回調發送,並在發送後將狀態機返回到空閒狀態。大多數消息都有一個相應的面向用戶的字符串來通知用戶錯誤,但並非所有錯誤都有這個面向用戶的字符串。有關錯誤消息的更多信息,請參閱types.hal
。所有錯誤消息都代表一個終端狀態,這意味著框架假定 HAL 在發送錯誤消息後返回空閒狀態。
採集消息
獲取消息在註冊或身份驗證期間傳遞,旨在引導用戶成功註冊或身份驗證。每個序號都有來自FaceAuthenticationManager.java
文件的關聯消息。只要提供了相應的幫助字符串,就可以添加特定於供應商的消息。獲取消息本身並不是終端狀態; HAL 應根據需要發送盡可能多的這些信息,以完成當前的註冊或身份驗證。如果採集消息導致無法取得進展的終端狀態,則 HAL 應在採集消息之後發出錯誤消息,例如,圖像太暗且太暗而無法取得進展。在這種情況下,在多次嘗試但無法取得進一步進展後發送UNABLE_TO_PROCESS
是合理的。
硬件
為了使設備符合 Android 10 的嚴格生物識別要求,它們必須具有安全的硬件,以確保人臉數據的完整性和最終的身份驗證比較。 Android 兼容性定義文檔 (CDD) 概述了所需的安全級別和可接受的欺騙接受率 (SAR)。安全處理和識別需要可信執行環境 (TEE)。此外,需要安全的攝像頭硬件來防止對面部身份驗證的注入攻擊。例如,圖像數據的相關內存頁面可以被授予特權並標記為只讀,因此只有相機硬件可以更新它們。理想情況下,除了 TEE 和硬件之外,任何進程都不應具有訪問權限。
由於人臉認證硬件差異很大,因此有必要開發特定於硬件的驅動程序來啟用人臉認證,具體取決於特定的設備架構。因此,沒有針對faced
的參考實現。
方法
以下方法都是異步的,必須立即返回框架。否則會導致系統速度變慢和潛在的看門狗重置。建議使用具有多個線程的消息隊列以避免阻塞調用者。所有 GET 請求都應盡可能緩存信息,以便在最短的時間內阻塞調用者。
方法 | 描述 |
---|---|
setCallback() | 由FaceService 調用以將所有消息返回給自身。 |
setActiveUser() | 設置活動用戶,所有後續 HAL 操作都將應用該用戶。在再次調用此方法之前,始終對此用戶進行身份驗證。 |
revokeChallenge() | 通過使generateChallenge() 生成的質詢無效來完成安全事務。 |
enroll() | 註冊用戶的面孔。 |
cancel() | 取消當前操作(例如,註冊、驗證、刪除或枚舉)並faced 到空閒狀態。 |
enumerate() | 枚舉與活動用戶關聯的所有面部模板。 |
remove() | 刪除與活動用戶關聯的面部模板或所有面部模板。 |
authenticate() | 對活動用戶進行身份驗證。 |
userActivity() | 此方法僅應在 HAL 處於身份驗證或待機狀態時使用。當 HAL 不處於這些狀態之一時使用此方法會返回OPERATION_NOT_SUPPORTED 。在 HAL 已經進行身份驗證時調用此方法可能會延長系統查找人臉的時間。 |
resetLockout() | 當拒絕太多faced 時,需要面進入鎖定狀態( LOCKOUT 或LOCKOUT_PERMANENT )。當它完成時,需要將剩餘時間發送到框架,以便它可以向用戶顯示。與setFeature() 一樣,此方法需要一個活動的硬件身份驗證令牌 (HAT) 來安全地重置內部狀態。僅為當前用戶重置鎖定。 |
剩下的三個方法都是同步的,應該阻塞最少的時間以避免框架停滯。
方法 | 描述 |
---|---|
generateChallenge() | 生成一個唯一且加密安全的隨機令牌,用於指示安全事務的開始。 |
setFeature() | 為當前用戶啟用或禁用功能。出於安全原因,這需要 HAT 針對上述挑戰檢查用戶的 pin/pattern/password |
getFeature() | 檢索功能的當前啟用狀態,如默認值或上面對setFeature() 的調用所指示的。如果人臉 ID 無效,則實現必須返回ILLEGAL_ARGUMENT |
getAuthenticatorId() | 返回與當前面部集關聯的標識符。每當添加人臉時,此標識符必須更改 |
狀態圖
該框架期望faced
遵循下面的狀態圖。