指紋 HIDL

在配備指紋感應器的裝置上,使用者可以註冊一或多個指紋,並使用這些指紋解鎖裝置及執行其他工作。Android 會使用指紋硬體介面定義語言 (HIDL) 連線至供應商專屬程式庫和指紋硬體 (例如指紋感應器)。

如要實作指紋 HIDL,您必須在供應商專屬程式庫中實作 IBiometricsFingerprint.hal

指紋比對

裝置的指紋感應器通常處於閒置狀態。不過,在回應 authenticateenroll 的呼叫時,指紋感應器會監聽觸控事件 (使用者觸碰指紋感應器時,螢幕也可能會喚醒)。指紋比對的高階流程包含下列步驟:

  1. 使用者將手指放在指紋感應器上。
  2. 廠商專屬程式庫會判斷目前註冊的指紋範本組中,是否有相符的指紋。
  3. 相符的結果會傳遞至 FingerprintService

這個流程假設裝置已註冊指紋,也就是廠商專屬程式庫已註冊指紋範本。詳情請參閱驗證

建築

指紋 HAL 會與下列元件互動。

  • BiometricManager 會在應用程式程序中直接與應用程式互動。 每個應用程式都有 IBiometricsFingerprint.hal 的執行個體
  • FingerprintService 會在系統程序中運作,負責處理與指紋 HAL 的通訊。
  • 指紋 HAL 是 IBiometricsFingerprint HIDL 介面的 C/C++ 實作項目。其中包含與裝置專屬硬體通訊的供應商專屬程式庫。
  • KeyStore API 和 KeyMint (先前稱為 Keymaster) 元件提供硬體支援的加密技術,可在安全環境 (例如受信任的執行環境 (TEE)) 中安全儲存金鑰。
指紋驗證的資料流程
圖 1. 指紋驗證的高階資料流程

廠商專屬的 HAL 實作項目必須使用 TEE 要求的通訊協定。原始圖像和處理過的指紋特徵不得傳遞至不受信任的記憶體。所有這類生物特徵辨識資料都必須儲存在安全硬體 (例如 TEE) 中。啟用裝置的 Root 權限時,不得洩露生物辨識資料。

FingerprintServicefingerprintd 會透過指紋 HAL 呼叫供應商專屬程式庫,以註冊指紋及執行其他作業。

與指紋感應器互動
圖 2. 指紋精靈與指紋供應商專屬程式庫的互動

導入指南

下列指紋 HAL 指南旨在確保指紋資料不會洩漏,且在使用者從裝置中移除時會一併移除

  • 感應器驅動程式或 TEE 外部絕不能存取原始指紋資料或衍生資料 (例如範本)。如果硬體支援 TEE,硬體存取範圍僅限於 TEE,並且受到 SELinux 政策的保護。序列周邊介面 (SPI) 通道只能由 TEE 存取,且所有裝置檔案都必須有明確的 SELinux 政策。
  • 指紋擷取、註冊和辨識程序必須在 TEE 中執行。
  • 檔案系統只能儲存經過加密的指紋資料 (即使檔案系統本身已加密也一樣)。
  • 指紋範本必須使用裝置專屬的私密金鑰簽署。 對於進階加密標準 (AES),範本至少必須以絕對檔案系統路徑、群組和指紋 ID 簽署,這樣範本檔案才能在其他裝置上運作,或供使用者以外的人員在同一部裝置上註冊。舉例來說,任何人都無法複製同一部裝置上其他使用者的指紋資料,也無法複製其他裝置上的指紋資料。
  • 實作時必須使用 setActiveGroup() 函式提供的檔案系統路徑,或在移除使用者時提供清除所有使用者範本資料的方法。強烈建議您將指紋範本檔案加密,並儲存在提供的路徑中。如果因 TEE 儲存空間需求而無法這麼做,實作者必須新增掛鉤,確保在移除使用者時一併移除資料。

指紋辨識方法

Fingerprint HIDL 介面在 IBiometricsFingerprint.hal 中包含下列主要方法。

方法 說明
enroll() 將 HAL 狀態機器切換為開始收集及儲存指紋範本。註冊完成或逾時後,HAL 狀態機器會返回閒置狀態。
preEnroll() 產生專屬權杖,指出指紋註冊程序已開始。提供權杖給 enroll 函式,確保先前已完成驗證 (例如使用密碼)。為防止遭人竄改,系統會在確認裝置憑證後包裝權杖。註冊時必須檢查權杖,確認權杖是否仍有效。
getAuthenticatorId() 傳回與目前指紋集相關聯的權杖。
cancel() 取消待處理的註冊或驗證作業。HAL 狀態機器會返回閒置狀態。
enumerate() 同步呼叫,用於列舉所有已知的指紋範本。
remove() 刪除指紋範本。
setActiveGroup() 將 HAL 作業限制為屬於特定群組的一組指紋,並以群組 ID (GID) 識別。
authenticate() 驗證指紋相關作業 (以作業 ID 識別)。
setNotify() 註冊接收 HAL 通知的使用者函式。如果 HAL 狀態機器處於忙碌狀態,函式會遭到封鎖,直到 HAL 離開忙碌狀態為止。
postEnroll() 完成註冊作業,並使產生的 preEnroll() 驗證碼失效。必須在多指紋註冊工作階段結束時呼叫此函式,表示無法再新增指紋。

如要進一步瞭解這些項目,請參閱 IBiometricsFingerprint.hal 中的註解。