人臉身份驗證 HIDL

概述

人臉身份驗證允許用戶通過查看設備正面來解鎖設備。 Android 10 增加了對新的人臉身份驗證堆棧的支持,該堆棧可以安全地處理相機幀,在支持的硬件上進行人臉身份驗證期間保護安全性和隱私。 Android 10 還為符合安全要求的實現提供了一種簡單的方法,以支持交易應用程序集成,例如在線銀行或其他服務。

Android 人臉身份驗證堆棧是 Android 10 中的新實現。新實現引入了IBiometricsFace.halIBiometricsFaceClientCallback.haltypes.hal接口。

建築學

BiometricPrompt API 包括所有生物特徵認證,包括面部、手指和虹膜。 Face HAL 與以下組件交互。

生物識別堆棧
圖 1.生物識別堆棧

人臉管理器

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時,需要面進入鎖定狀態( LOCKOUTLOCKOUT_PERMANENT )。當它完成時,需要將剩餘時間發送到框架,以便它可以向用戶顯示。與setFeature()一樣,此方法需要一個活動的硬件身份驗證令牌 (HAT) 來安全地重置內部狀態。僅為當前用戶重置鎖定。

剩下的三個方法都是同步的,應該阻塞最少的時間以避免框架停滯。

方法描述
generateChallenge()生成一個唯一且加密安全的隨機令牌,用於指示安全事務的開始。
setFeature()為當前用戶啟用或禁用功能。出於安全原因,這需要 HAT 針對上述挑戰檢查用戶的 pin/pattern/password
getFeature()檢索功能的當前啟用狀態,如默認值或上面對setFeature()的調用所指示的。如果人臉 ID 無效,則實現必須返回ILLEGAL_ARGUMENT
getAuthenticatorId()返回與當前面部集關聯的標識符。每當添加人臉時,此標識符必須更改

狀態圖

該框架期望faced遵循下面的狀態圖。

狀態圖
圖 2.人臉認證狀態流程