在帶有指紋傳感器的設備上,用戶可以註冊一個或多個指紋並使用這些指紋解鎖設備並執行其他任務。 Android 使用指紋硬件接口定義語言 (HIDL) 連接到特定於供應商的庫和指紋硬件(例如,指紋傳感器)。
要實現指紋 HIDL,您必須在特定於供應商的庫中實現IBiometricsFingerprint.hal
。
指紋匹配
設備的指紋傳感器通常處於空閒狀態。但是,為了響應authenticate
或enroll
的調用,指紋傳感器會監聽觸摸(當用戶觸摸指紋傳感器時,屏幕也可能會喚醒)。指紋匹配的高級流程包括以下步驟:
- 用戶將手指放在指紋傳感器上。
- 特定於供應商的庫確定當前註冊的指紋模板集中是否存在指紋匹配。
- 匹配結果被傳遞給
FingerprintService
。
此流程假定已在設備上註冊指紋,即供應商特定庫已註冊指紋模板。有關更多詳細信息,請參閱身份驗證。
建築學
指紋 HAL 與以下組件交互。
-
BiometricManager
在應用進程中直接與應用交互。每個應用程序都有一個IBiometricsFingerprint.hal
實例 FingerprintService
在系統進程中運行,該進程處理與指紋 HAL 的通信。- Fingerprint HAL是 IBiometricsFingerprint HIDL 接口的 C/C++ 實現。這包含與設備特定硬件通信的供應商特定庫。
- Keystore API 和 Keymaster組件為安全環境中的安全密鑰存儲提供硬件支持的加密,例如可信執行環境 (TEE)。
特定於供應商的 HAL 實現必須使用 TEE 所需的通信協議。原始圖像和處理過的指紋特徵不得在不受信任的內存中傳遞。所有此類生物特徵數據都需要存儲在 TEE 等安全硬件中。生根不能損害生物特徵數據。
FingerprintService
和fingerprintd
通過Fingerprint 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 操作限制為屬於指定組的一組指紋,由組標識符 (GID) 標識。 |
authenticate() | 驗證指紋相關操作(由操作 ID 標識)。 |
setNotify() | 註冊一個從 HAL 接收通知的用戶函數。如果 HAL 狀態機處於忙碌狀態,則該功能被阻塞,直到 HAL 離開忙碌狀態。 |
postEnroll() | 完成註冊操作並使preEnroll() 生成的質詢無效。這必須在多指註冊會話結束時調用,以指示不能添加更多指。 |
有關這些的更多詳細信息,請參閱IBiometricsFingerprint.hal
中的註釋。
在帶有指紋傳感器的設備上,用戶可以註冊一個或多個指紋並使用這些指紋解鎖設備並執行其他任務。 Android 使用指紋硬件接口定義語言 (HIDL) 連接到特定於供應商的庫和指紋硬件(例如,指紋傳感器)。
要實現指紋 HIDL,您必須在特定於供應商的庫中實現IBiometricsFingerprint.hal
。
指紋匹配
設備的指紋傳感器通常處於空閒狀態。但是,為了響應authenticate
或enroll
的調用,指紋傳感器會監聽觸摸(當用戶觸摸指紋傳感器時,屏幕也可能會喚醒)。指紋匹配的高級流程包括以下步驟:
- 用戶將手指放在指紋傳感器上。
- 特定於供應商的庫確定當前註冊的指紋模板集中是否存在指紋匹配。
- 匹配結果被傳遞給
FingerprintService
。
此流程假定已在設備上註冊指紋,即供應商特定庫已註冊指紋模板。有關更多詳細信息,請參閱身份驗證。
建築學
指紋 HAL 與以下組件交互。
-
BiometricManager
在應用進程中直接與應用交互。每個應用程序都有一個IBiometricsFingerprint.hal
實例 FingerprintService
在系統進程中運行,該進程處理與指紋 HAL 的通信。- Fingerprint HAL是 IBiometricsFingerprint HIDL 接口的 C/C++ 實現。這包含與設備特定硬件通信的供應商特定庫。
- Keystore API 和 Keymaster組件為安全環境中的安全密鑰存儲提供硬件支持的加密,例如可信執行環境 (TEE)。
特定於供應商的 HAL 實現必須使用 TEE 所需的通信協議。原始圖像和處理過的指紋特徵不得在不受信任的內存中傳遞。所有此類生物特徵數據都需要存儲在 TEE 等安全硬件中。生根不能損害生物特徵數據。
FingerprintService
和fingerprintd
通過Fingerprint 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 操作限制為屬於指定組的一組指紋,由組標識符 (GID) 標識。 |
authenticate() | 驗證指紋相關操作(由操作 ID 標識)。 |
setNotify() | 註冊一個從 HAL 接收通知的用戶函數。如果 HAL 狀態機處於忙碌狀態,則該功能被阻塞,直到 HAL 離開忙碌狀態。 |
postEnroll() | 完成註冊操作並使preEnroll() 生成的質詢無效。這必須在多指註冊會話結束時調用,以指示不能添加更多指。 |
有關這些的更多詳細信息,請參閱IBiometricsFingerprint.hal
中的註釋。