人臉身份驗證 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

要實作 Face 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()當太多faces被拒絕時, faced需要進入鎖定狀態( LOCKOUTLOCKOUT_PERMANENT )。當它發生時,需要將剩餘時間發送到框架,以便它可以向使用者顯示它。與setFeature()一樣,此方法需要活動硬體驗證令牌 (HAT) 來安全地重置內部狀態。重置目前使用者的鎖定。

其餘三個方法都是同步的,並且應該阻塞最短的時間,以避免框架停頓。

方法描述
generateChallenge()產生一個獨特且加密安全的隨機令牌,用於指示安全交易的開始。
setFeature()為目前使用者啟用或停用某項功能。出於安全原因,這需要 HAT 根據上述挑戰檢查使用者的 PIN/圖案/密碼
getFeature()擷取功能的目前啟用狀態,如預設值或上面對setFeature()的呼叫所指示的。如果人臉 ID 無效,則實作必須傳回ILLEGAL_ARGUMENT
getAuthenticatorId()傳回與目前臉部集關聯的識別碼。每當新增人臉時,該標識符都必須更改

狀態圖

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

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