在有指紋感應器的裝置上,使用者可以註冊一個或多個指紋並使用這些指紋解鎖裝置並執行其他任務。 Android 使用指紋硬體介面定義語言 (HIDL) 連接到特定於供應商的程式庫和指紋硬體(例如指紋感應器)。
要實現指紋 HIDL,您必須在特定於供應商的庫中實作IBiometricsFingerprint.hal
。
指紋比對
設備的指紋感應器通常處於空閒狀態。但是,為了回應對authenticate
或enroll
,指紋感應器會偵聽觸控(當使用者觸摸指紋感應器時,螢幕也可能會喚醒)。指紋匹配的高階流程包括以下步驟:
- 使用者將手指放在指紋感應器上。
- 供應商特定的庫確定目前註冊的指紋模板集中是否存在指紋匹配。
- 匹配結果傳遞給
FingerprintService
。
此流程假設裝置上已註冊指紋,即供應商特定庫已註冊指紋範本。有關更多詳細信息,請參閱身份驗證。
建築學
Fingerprint HAL 與以下元件互動。
-
BiometricManager
直接與應用程式進程中的應用程式互動。每個應用程式都有一個IBiometricsFingerprint.hal
實例 FingerprintService
運行在系統流程中,處理與指紋 HAL 的通訊。- Fingerprint HAL是 IBiometricsFingerprint HIDL 介面的 C/C++ 實作。它包含與特定於設備的硬體進行通訊的特定於供應商的庫。
- Keystore API 和 Keymaster元件為安全環境(例如可信任執行環境 (TEE))中的安全金鑰儲存提供硬體支援的加密。
![指紋認證資料流](https://source.android.google.cn/static/docs/security/images/fingerprint-data-flow.png?authuser=8&hl=zh-tw)
特定於供應商的 HAL 實作必須使用 TEE 所需的通訊協定。原始影像和處理後的指紋特徵不得在不可信記憶體中傳遞。所有此類生物辨識資料都需要儲存在 TEE 等安全硬體中。生根必須不能損害生物辨識數據。
FingerprintService
和fingerprintd
透過 Fingerprint HAL 呼叫特定於供應商的函式庫來註冊指紋並執行其他操作。
![與指紋交互](https://source.android.google.cn/static/docs/security/images/fingerprint-daemon.png?authuser=8&hl=zh-tw)
實施指南
以下指紋 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 操作限制為屬於指定群組的一組指紋,由群組標識符 (GID) 標識。 |
authenticate() | 驗證指紋相關操作(透過操作ID標識)。 |
setNotify() | 註冊一個從 HAL 接收通知的使用者函數。如果 HAL 狀態機處於繁忙狀態,則函數將被阻塞,直到 HAL 離開繁忙狀態。 |
postEnroll() | 完成註冊操作並使preEnroll() 產生的質詢無效。必須在多手指註冊會話結束時呼叫此函數,以指示不能新增更多手指。 |
有關這些的更多詳細信息,請參閱IBiometricsFingerprint.hal
中的註釋。