Fingerprint HIDL

Fingerprint HIDL

在配有指紋傳感器的設備上,用戶可以註冊一個或多個指紋,並使用這些指紋來解鎖設備以及執行其他任務。Android 會利用 Fingerprint HIDL(硬件接口定義語言)連接到供應商專用庫和指紋硬件(例如指紋傳感器)。

要實現 Fingerprint HIDL,您必須在某個供應商專用庫中實現 IBiometricsFingerprint.hal

指紋匹配

設備的指紋傳感器通常處於閒置狀態。不過,爲了響應對 authenticate 或 enroll 的調用,指紋傳感器會監聽觸摸操作(並且屏幕可能會在用戶觸摸指紋傳感器時被喚醒)。指紋匹配的概要流程包括以下步驟:

  1. 用戶將手指放在指紋傳感器上。
  2. 供應商專用庫會根據當前的已註冊指紋模板集判斷是否匹配。
  3. 匹配結果會傳遞到 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 中的備註。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章