生物识别是一种更方便的使用设备进行身份确认的方法,但其安全性可能较低。在分层身份验证模式下,主要身份验证方法(即基于验证凭据的模态,例如 PIN 码、图案和密码)的安全级别最高。生物识别属于第二层级的身份验证方法,对便利性和安全性进行了很好的平衡。Android CDD 定义了三类生物识别强度:第 3 类(以前称为“强类”)、第 2 类(以前称为“弱类”)和第 1 类(以前称为“便利类”)。每一类都有一系列前提条件、特权和约束条件。如需了解详情,请参阅上面的 CDD。所有这三类都可以与锁屏集成,但只有“强”和“弱”身份验证器才能与 android.hardware.biometrics API 集成。下表介绍了每个身份验证器及其支持的功能。
身份验证器 | 锁屏 | BiometricPrompt 集成 | 密钥库(基于时间的密钥) | 密钥库(基于操作的密钥) |
---|---|---|---|---|
BIOMETRIC_STRONG(第 3 类) | 是 | 是 | 是 | 是 |
BIOMETRIC_WEAK(第 2 类) | 是 | 是 | 否 | 否 |
BIOMETRIC_CONVENIENCE (第 1 类) |
是 | 否 | 否 | 否 |
DEVICE_CREDENTIAL | 是 | 是 | 是 | 是 |
Android 框架支持人脸和指纹生物识别身份验证。您可对 Android 进行自定义,以支持其他生物识别模式(例如虹膜识别)。不过,生物识别集成将取决于生物识别安全性,而非模式。如需详细了解生物识别安全规范,请参阅衡量生物识别解锁模式的安全性。
源代码
Android 12
- 引入了 BiometricManager.Strings API,它为使用 BiometricPrompt 进行身份验证的应用提供了本地化字符串。这些字符串旨在感知设备,并更明确地指定可以使用哪种/哪些身份验证类型。
- 支持屏下指纹传感器 (UDFPS)。
Android 11
- 引入了 BiometricManager.Authenticators 接口,开发者可以使用该接口提供的常量来指定其应用接受的身份验证类型。
- 添加了
ACTION_BIOMETRIC_ENROLL
intent 操作,开发者可以使用该操作来引导用户注册符合其应用要求的身份验证方法。 - 添加了
AuthenticationResult#getAuthenticationType()
方法,开发者可以使用该方法检查用户是使用生物识别凭据还是设备凭据进行身份验证。 - 为 BiometricPrompt 类中的每次使用时进行身份验证密钥提供额外的支持。
Android 10
- 引入了
BiometricManager
类,开发者可用其查询生物识别身份验证的可用性。 - 包含
BiometricPrompt
指纹和人脸识别身份验证集成
Android 9
- 仅包含适用于
BiometricPrompt
的指纹集成。 - 弃用了 FingerprintManager 类。如果您的捆绑式应用和系统应用使用此类,请更新这些应用以改用
BiometricPrompt
和BiometricManager
。 - 更新了
FingerprintManager
CTS 验证程序测试,以使用BiometricPromptBoundKeysTest
测试BiometricPrompt
。
实现
为确保用户和开发者获享无缝的生物识别体验,请将生物识别堆栈与 BiometricPrompt
、BiometricManager
和 ACTION_BIOMETRIC_ENROLL
API 集成。配有生物识别传感器的设备必须遵循这些强度要求。此外,所有实现都必须通过 CtsBiometricsTestCases CTS 模块的测试。
如需将生物识别堆栈与 ACTION_BIOMETRIC_ENROLL API 集成,请执行以下操作:
- 修改 BiometricEnrollActivity 以显示注册流程。请注意,生物识别信息仅在符合请求的强度时才会显示。如果您的设备支持多种验证方法,此操作应显示一个列表供用户从中选择。
HAL 实现指南
遵循以下生物识别 HAL 准则,确保生物识别数据不会泄露,并在从设备中移除用户时一并移除:
- 确保在任何情况下都无法从安全隔离环境(例如 TEE 或安全元件)以外访问原始生物识别数据或衍生内容(例如模板)。所有存储的数据都必须使用仅对 TEE(可信执行环境)已知的设备专用密钥进行加密。如果硬件支持,则限制硬件对安全隔离环境的访问权限,并使用 SELinux 政策对其进行保护。使用针对所有设备文件的明确 SELinux 政策,确保信道(例如 SPI、I2C 等)只能供安全隔离环境访问。
- 生物识别信息的采集、注册和识别必须在安全隔离环境内部进行,以防范数据泄露和其他攻击。此要求仅适用于第 3 类(以前称为“强类”)和第 2 类(以前称为“弱类”)生物识别。
- 为了防范重放攻击,请使用设备专用私钥对生物识别模板进行签名。对于高级加密标准 (AES),至少必须通过绝对文件系统路径、群组和生物识别 ID 对模板签名,使相应模板文件无法在其他设备上使用,也无法供同一设备上除注册者以外的任何其他用户使用。例如,您将无法复制同一设备上其他用户的生物识别数据,也无法从其他设备复制生物识别数据。
- 如果您需要将数据存储在 TEE 之外,请使用
setActiveUser() HIDL method
提供的文件系统路径,或提供另一种能够在移除用户时一并清除所有用户模板数据的方法。这样做是为了防止用户数据泄露。在移除用户后必须对不使用此路径的设备进行清理。CDD 要求生物识别数据和衍生文件以加密形式存储,尤其是不在 TEE 中时。如果因安全隔离环境的存储要求而导致这种做法不可行,请添加钩子以确保在移除用户或擦除设备时移除相关数据。请参阅 LockSettingsService.removeBiometricsForUser()
自定义
如果您的设备支持多种生物识别技术,用户应可以在设置中指定默认值。您的 BiometricPrompt
实现应该默认首选第 3 类(以前称为“强类”)生物识别技术(除非用户明确替换该选项),并需要显示一条警告消息来说明与生物识别相关的风险(例如照片可能能够解锁设备)
设备专用身份验证字符串
从 Android 12 开始,开发者可通过 BiometricManager.Strings API 使用上下文身份验证字符串。您可以自定义该 API 返回的资源值,以实现设备专用字符串。如果这样做,请确保针对设备支持的所有语言区域翻译所有新字符串。此外,请务必保留以下属性:
方法 |
字符串用途 |
要包含的身份验证类型 |
能否同时使用生物识别和屏幕锁定功能 |
---|---|---|---|
getButtonLabel() |
BiometricPrompt 触发按钮的标签 |
仅限满足身份验证器要求的“已注册”类型(如果可能) |
使用“biometric-only”字符串(例如:“使用指纹”) |
getPromptMessage() |
进行身份验证时,BiometricPrompt 显示的消息 |
仅限满足身份验证器要求的“已注册”类型(如果可能) |
使用“combined”生物识别和屏幕锁定字符串(例如:“使用您的指纹或 PIN 码以继续”) |
getSettingName() |
可启用 BiometricPrompt 进行身份验证的一项设置的名称 |
设备支持的所有满足身份验证器要求的类型(即使未注册) |
使用“combined”生物识别和屏幕锁定字符串(例如:“使用指纹或屏幕锁定”) |
例如,假设某个设备具有第 2 类人脸传感器(带有已注册的人脸)、已注册的 PIN 码和第 3 类指纹传感器(没有已注册的指纹)。针对允许的身份验证器的各种组合以及调用的 BiometricManager.Strings 方法,下表提供了示例字符串:
允许的身份验证器 |
getButtonLabel() |
getPromptMessage() |
getSettingName() |
---|---|---|---|
第 3 类生物识别 (BIOMETRIC_STRONG) |
“使用指纹” (只有指纹满足身份验证器的要求) |
“使用您的指纹以继续” (只有指纹满足身份验证器的要求) |
“使用指纹” (只有指纹满足身份验证器的要求) |
第 2 类生物识别 (BIOMETRIC_WEAK) |
“刷脸” (人脸和指纹满足要求;只有人脸已注册) |
“刷脸以继续” (人脸和指纹满足要求;只有人脸已注册) |
“刷脸或使用指纹” (人脸和指纹满足要求;设备支持这两者) |
屏幕锁定 (DEVICE_CREDENTIAL) |
“使用 PIN 码” (任何屏幕锁定功能均满足要求;PIN 码已注册) |
“输入您的 PIN 码以继续” (任何屏幕锁定功能均满足要求;PIN 码已注册) |
“使用屏幕锁定” (任何屏幕锁定功能均满足要求) |
第 3 类生物识别或屏幕锁定 |
“使用 PIN 码” (指纹和任何屏幕锁定功能均满足要求;只有 PIN 码已注册) |
“输入您的 PIN 码以继续” (指纹和任何屏幕锁定功能均满足要求;只有 PIN 码已注册) |
“使用指纹或屏幕锁定” (指纹和任何屏幕锁定功能均满足要求) |
第 2 类生物识别或屏幕锁定 |
“刷脸” (人脸、指纹和任何屏幕锁定功能均满足要求;人脸已注册并且取代了 PIN 码) |
“刷脸或使用 PIN 码以继续” (人脸、指纹和任何屏幕锁定功能均满足要求;人脸和 PIN 码均已注册) |
“使用生物识别或屏幕锁定” (人脸、指纹和任何屏幕锁定功能均满足要求) |
验证
您的生物识别实现必须通过以下测试:
- CTS BiometricManager
- CTS BiometricPrompt(健全性方面的深入测试依赖于验证程序)
- CtsVerifier 生物识别测试部分:必须分别通过设备支持的每种模态的各项测试
此外,如果您的设备支持具有 AOSP HIDL 的生物识别技术(fingerprint@2.1、fingerprint@2.2、face1.0),则必须通过与之相关的 VTS 测试(fingerprint、face)