指紋 HIDL

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

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

指紋比對

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

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

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

建築

Fingerprint HAL 會與下列元件互動。

  • BiometricManager 會直接與應用程式程序中的應用程式互動。每個應用程式都有 IBiometricsFingerprint.hal 的例項
  • FingerprintService 會在系統程序中運作,該程序會處理與指紋 HAL 的通訊。
  • 指紋 HAL 是 IBiometricsFingerprint HIDL 介面的 C/C++ 實作項目。其中包含供應商專屬的程式庫,可與裝置專屬硬體通訊。
  • Keystore API 和 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 中的註解。