在配備指紋感應器的裝置上,使用者可以註冊一或多個指紋,並使用這些指紋解鎖裝置及執行其他工作。Android 會使用指紋硬體介面定義語言 (HIDL) 連線至供應商專屬程式庫和指紋硬體 (例如指紋感應器)。
如要實作指紋 HIDL,您必須在供應商專屬程式庫中實作 IBiometricsFingerprint.hal
。
指紋比對
裝置的指紋感應器通常處於閒置狀態。不過,在回應 authenticate
或 enroll
的呼叫時,指紋感應器會監聽觸控事件 (使用者觸碰指紋感應器時,螢幕也可能會喚醒)。指紋比對的高階流程包含下列步驟:
- 使用者將手指放在指紋感應器上。
- 廠商專屬程式庫會判斷目前註冊的指紋範本組中,是否有相符的指紋。
- 相符的結果會傳遞至
FingerprintService
。
這個流程假設裝置已註冊指紋,也就是廠商專屬程式庫已註冊指紋範本。詳情請參閱驗證。
建築
指紋 HAL 會與下列元件互動。
BiometricManager
會在應用程式程序中直接與應用程式互動。 每個應用程式都有IBiometricsFingerprint.hal
的執行個體FingerprintService
會在系統程序中運作,負責處理與指紋 HAL 的通訊。- 指紋 HAL 是 IBiometricsFingerprint HIDL 介面的 C/C++ 實作項目。其中包含與裝置專屬硬體通訊的供應商專屬程式庫。
- KeyStore API 和 KeyMint (先前稱為 Keymaster) 元件提供硬體支援的加密技術,可在安全環境 (例如受信任的執行環境 (TEE)) 中安全儲存金鑰。

廠商專屬的 HAL 實作項目必須使用 TEE 要求的通訊協定。原始圖像和處理過的指紋特徵不得傳遞至不受信任的記憶體。所有這類生物特徵辨識資料都必須儲存在安全硬體 (例如 TEE) 中。啟用裝置的 Root 權限時,不得洩露生物辨識資料。
FingerprintService
和 fingerprintd
會透過指紋 HAL 呼叫供應商專屬程式庫,以註冊指紋及執行其他作業。

導入指南
下列指紋 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
中的註解。