生物识别

生物识别是一种更方便的使用设备进行身份确认的方法,但其安全性可能较低。在分层身份验证模式下,主要身份验证方法(即基于验证凭据的模态,例如 PIN 码、图案和密码)的安全级别最高。生物识别属于第二层级的身份验证方法,对便利性和安全性进行了很好的平衡。Android CDD 定义了三类生物识别强度:第 3 类(以前称为“强类”)、第 2 类(以前称为“弱类”)和第 1 类(以前称为“便利类”)。每一类都有一系列前提条件、特权和约束条件。如需了解详情,请参阅上面的 CDD。所有这三类都可以与锁屏集成,但只有“强”和“弱”身份验证器才能与 android.hardware.biometrics API 集成。下表介绍了每个身份验证器及其支持的功能。

身份验证器 锁屏 BiometricPrompt 集成 密钥库(基于时间的密钥) 密钥库(基于操作的密钥)
BIOMETRIC_STRONG(第 3 类)
BIOMETRIC_WEAK(第 2 类)
BIOMETRIC_CONVENIENCE
(第 1 类)
DEVICE_CREDENTIAL 是 (1)
  1. Android 11 中添加了此功能;如需了解详情,请查看这篇文章

Android 框架支持人脸和指纹生物识别身份验证。您可对 Android 进行自定义以支持其他生物识别模态(例如虹膜)。不过,生物识别集成将取决于生物识别安全性,而不是模态。如需详细了解生物识别安全规范,请参阅衡量生物识别解锁模式的安全性

源代码

Android 11

  • 引入了 BiometricManager.Authenticators 接口,开发者可以使用该接口提供的常量来指定其应用接受的身份验证类型。
  • 添加了 ACTION_BIOMETRIC_ENROLL intent 操作,开发者可以使用该操作来引导用户注册符合其应用要求的身份验证方法。
  • 添加了 AuthenticationResult#getAuthenticationType() 方法,开发者可以使用该方法检查用户是使用生物识别凭据还是设备凭据进行身份验证。
  • 为 BiometricPrompt 类中的每次使用时进行身份验证密钥提供额外的支持。

Android 10

Android 9

  • 仅包含适用于 BiometricPrompt 的指纹集成。
  • 弃用了 FingerprintManager 类。如果您的捆绑式应用和系统应用使用此类,请更新这些应用以改用 BiometricPromptBiometricManager
  • 更新了 FingerprintManager CTS 验证程序测试,以使用 BiometricPromptBoundKeysTest 测试 BiometricPrompt

实现

为确保用户和开发者获享无缝的生物识别体验,请将生物识别堆栈与 BiometricPromptBiometricManagerACTION_BIOMETRIC_ENROLL API 集成。配有生物识别传感器的设备必须遵循这些强度要求
如需将生物识别堆栈与 BiometricPromptBiometricManager APIs 集成,请执行以下操作:

  1. 确保通过 IBiometricService#registerAuthenticator 方法向 BiometricService 正确注册 <Modality>Service,并实现 IBiometricAuthenticator 接口。常见的模态(指纹、人脸)从共同的父类扩展。如果您需要集成不受支持的模态,请遵循指纹/人脸识别示例及针对生物识别的 CDD 指南
  2. 确保您的新模态在 SystemUI 中得到了相应支持。系统提供了适用于指纹和人脸识别的 BiometricPrompt 默认界面。其中应包括设备所需的任何布局或主题更改,即显示屏中指纹传感器的相应布局变化。

如需将生物识别堆栈与 ACTION_BIOMETRIC_ENROLL API 集成,请执行以下操作:

  1. 修改 BiometricEnrollActivity 以显示注册流程。请注意,生物识别信息仅在符合请求的强度时才会显示。如果您的设备支持多种验证方法,此操作应显示一个列表供用户从中选择。
BiometricPrompt 架构
图 1. BiometricPrompt 架构

HAL 实现指南

遵循以下生物识别 HAL 准则,以确保生物识别数据不会泄露,并在从设备中移除用户时一并移除

  • 确保在任何情况下都无法从安全隔离环境(例如 TEE 或安全元件)以外访问原始生物识别数据或衍生内容(例如模板)。所有存储的数据都必须使用仅对 TEE(可信执行环境)已知的设备专用密钥进行加密。如果硬件支持,则限制硬件对安全隔离环境的访问权限,并使用 SELinux 政策对其进行保护。使用针对所有设备文件的明确 SELinux 政策,确保信道(例如 SPI、I2C 等)只能供安全隔离环境访问。
  • 生物识别信息的采集、注册和识别必须在安全隔离环境内部进行,以防范数据泄露和其他攻击。此要求仅适用于第 3 类(以前称为“强类”)和第 2 类(以前称为“弱类”)生物识别。
  • 为了防范重放攻击,请使用设备专用私钥对生物识别模板进行签名。对于高级加密标准 (AES),至少必须通过绝对文件系统路径、群组和生物识别 ID 对模板签名,使相应模板文件无法在其他设备上使用,也无法供同一设备上除注册者以外的任何其他用户使用。例如,您将无法复制同一设备上其他用户的生物识别数据,也无法从其他设备复制生物识别数据。
  • 如果您需要将数据存储在 TEE 之外,请使用 setActiveUser() HIDL method 提供的文件系统路径,或提供另一种能够在移除用户时一并清除所有用户模板数据的方法。这样做是为了防止用户数据泄露。在移除用户后必须对不使用此路径的设备进行清理。CDD 要求生物识别数据和衍生文件以加密形式存储,尤其是不在 TEE 中时。如果因安全隔离环境的存储要求而导致这种做法不可行,请添加钩子以确保在移除用户或擦除设备时移除相关数据。请参阅 LockSettingsService.removeBiometricsForUser()

自定义

如果您的设备支持多种生物识别技术,用户应可以在设置中指定默认值。您的 BiometricPrompt 实现应该默认首选第 3 类(以前称为“强类”)生物识别技术(除非用户明确替换该选项),并需要显示一条警告消息来说明与生物识别相关的风险(例如照片可能能够解锁设备)

验证

您的生物识别实现必须通过以下测试:

  • CTS BiometricManager
  • CTS BiometricPrompt(健全性方面的深入测试依赖于验证程序)
  • CtsVerifier 生物识别测试部分:必须分别通过设备支持的每种模态的各项测试

此外,如果您的设备支持具有 AOSP HIDL 的生物识别技术(fingerprint@2.1fingerprint@2.2face1.0),则必须通过与之相关的 VTS 测试(fingerprintface