Fingerprint HIDL
在配有指紋傳感器的設備上,用戶可以註冊一個或多個指紋,並使用這些指紋來解鎖設備以及執行其他任務。Android 會利用 Fingerprint HIDL(硬件接口定義語言)連接到供應商專用庫和指紋硬件(例如指紋傳感器)。
要實現 Fingerprint HIDL,您必須在某個供應商專用庫中實現 IBiometricsFingerprint.hal
。
指紋匹配
設備的指紋傳感器通常處於閒置狀態。不過,爲了響應對 authenticate
或 enroll
的調用,指紋傳感器會監聽觸摸操作(並且屏幕可能會在用戶觸摸指紋傳感器時被喚醒)。指紋匹配的概要流程包括以下步驟:
- 用戶將手指放在指紋傳感器上。
- 供應商專用庫會根據當前的已註冊指紋模板集判斷是否匹配。
- 匹配結果會傳遞到
FingerprintService
。
該流程假設設備上已經註冊了一個指紋,即供應商專用庫已爲該指紋註冊了一個模板。如需瞭解詳情,請參閱身份驗證。
注意:設備上存儲的指紋模板越多,進行指紋匹配所需的時間就越長。
架構
Fingerprint HAL 會與以下組件交互。
BiometricManager
會在應用進程中與應用直接交互。每個應用都有一個IBiometricsFingerprint.hal
實例。FingerprintService
在系統進程中運行,可處理與 Fingerprint HAL 之間的通信。- Fingerprint HAL 是 IBiometricsFingerprint HIDL 接口的 C/C++ 實現。它包含可與設備專有硬件進行通信的供應商專用庫。
- Keystore API 和 Keymaster 組件提供由硬件支持的加密功能,以便在安全環境(例如可信執行環境 (TEE))中安全地存儲密鑰。
圖 1. 指紋身份驗證的概要數據流程
供應商專用 HAL 實現必須使用 TEE 所要求的通信協議。不得將原始圖像和處理後的指紋特徵傳遞到不可信內存中。所有此類生物識別數據都需要存儲在安全硬件(例如 TEE)中。請確保即使具備 Root 權限,也不能取得生物識別數據。
FingerprintService
和 fingerprintd
會通過 Fingerprint HAL 調用供應商專用庫,以便註冊指紋以及執行其他操作。
圖 2.Fingerprint 守護程序與 Fingerprint 供應商專用庫之間的交互
實現準則
以下 Fingerprint HAL 準則旨在確保指紋數據不會被泄露,並在從設備中移除用戶時,一併移除指紋數據:
- 必須要確保在任何情況下都無法從傳感器驅動程序或 TEE 以外訪問原始指紋數據或衍生內容(例如模板)。如果硬件支持 TEE,則只能將硬件訪問權限授予 TEE,並且必須通過 SELinux 政策對硬件訪問權限加以保護。串行外設接口 (SPI) 通道必須只能供 TEE 訪問,並且必須有針對所有設備文件的明確 SELinux 政策。
- 指紋採集、註冊和識別必須在 TEE 內部進行。
- 只有加密的指紋數據才能存儲在文件系統中(即使文件系統本身已加密)。
- 指紋模板必須採用設備專用私鑰進行簽名。對於高級加密標準 (AES),模板必須至少通過絕對文件系統路徑、羣組和指紋 ID 進行簽名,這樣一來,相應模板文件便無法在其他設備上使用,並且無法用於在同一設備上註冊的任何其他用戶。例如,您將無法複製同一設備上其他用戶的指紋數據,也無法從其他設備複製指紋數據。
- 實現必須使用
setActiveGroup()
函數提供的文件系統路徑,或提供一種能夠在移除用戶時一併清空該用戶所有模板數據的方法。強烈建議將指紋模板文件以加密形式存儲在提供的路徑中。如果因 TEE 存儲要求而導致這種做法不可行,實現人員必須添加一些鉤子,以確保在移除用戶時一併移除相關數據。
Fingerprint 方法
Fingerprint HIDL 接口在 IBiometricsFingerprint.hal
中包含以下主要方法。
方法 | 說明 |
---|---|
enroll() |
將 HAL 狀態機切換到開始收集和存儲指紋模板的狀態。註冊完成後或超時後,HAL 狀態機會返回到閒置狀態。 |
preEnroll() |
生成一個獨一無二的令牌,以指明指紋註冊已開始。爲 enroll 函數提供令牌,以確保事先已經過身份驗證(例如使用密碼)。爲了防止被篡改,確認設備憑據後,便會封裝令牌。註冊期間必須檢查令牌,以確認令牌仍然有效。 |
getAuthenticatorId() |
返回與當前指紋集關聯的令牌。 |
cancel() |
取消待處理的註冊或身份驗證操作。HAL 狀態機會返回到閒置狀態。 |
enumerate() |
同步調用,用於枚舉所有已知指紋模板。 |
remove() |
刪除指紋模板。 |
setActiveGroup() |
限定只能對屬於指定羣組(通過羣組標識符 (GID) 來標識)的指紋集執行某項 HAL 操作。 |
authenticate() |
驗證與指紋相關的操作(通過操作 ID 來標識)。 |
setNotify() |
註冊一個從 HAL 接收通知的用戶函數。如果 HAL 狀態機處於繁忙狀態,該函數會阻塞,直到 HAL 不再處於繁忙狀態爲止。 |
postEnroll() |
結束註冊操作並使 preEnroll() 生成的質詢代碼無效。必須在多指紋註冊會話結束時調用該函數,以表明不會再添加指紋。 |
如需詳細瞭解這些函數,請參閱 IBiometricsFingerprint.hal
中的備註。