生物识别

Android 9 及更高版本包含一个 BiometricPrompt API,应用开发者可以使用该 API 采用与设备和模态无关的方式将生物识别身份验证集成到其应用中。只有极为安全的生物识别技术才能与 BiometricPrompt 集成。如需了解详情,请参阅衡量生物识别解锁模式的安全性

源代码

Android 9 仅包含适用于 BiometricPrompt 的指纹集成。但是,我们即将提供对其他生物识别模态的集成支持。

在 Android 9 及更高版本中,FingerprintManager API 已被弃用。如果您的捆绑式应用和系统应用使用此 API,请更新这些应用以改用 BiometricPrompt

实现

为确保用户和开发者获享无缝的生物识别体验,请将生物识别堆栈与 BiometricPrompt 集成。为任何模态(包括面部、指纹和虹膜)启用 BiometricPrompt API 的设备必须符合这些安全程度要求。如果它们不符合这些安全程度要求,就无法实现此 API。

要将生物识别堆栈与 BiometricPrompt 集成,请执行以下操作:

  1. /frameworks/base/core/java/android/hardware/biometrics/BiometricPrompt.java 中添加一个 BiometricManager 类的实例
  2. 确保您的实例与 BiometricPrompt 提供的 authenticate() 方法挂钩。
  3. 更新框架以为添加的生物识别技术采用 KEYGUARD_DISABLE_* 标记。
BiometricPrompt 架构
图 1. BiometricPrompt 架构。

HAL 实现指南

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

  1. 确保在任何情况下都无法从传感器驱动程序或安全隔离环境(例如 TEE 或安全元件)以外访问原始生物识别数据或衍生内容(例如模板)。
  2. 如果硬件支持,则限制硬件对安全隔离环境的访问权限,并使用 SELinux 政策对其进行保护。使用针对所有设备文件的明确 SELinux 政策,确保信道(例如 SPI、I2C 等)只能供安全隔离环境访问。
  3. 为防止意外数据泄露,攻击免疫、指纹采集、注册和识别必须在安全隔离环境内部进行。
  4. 仅在文件系统上存储加密形式的生物识别数据或衍生内容(即使文件系统本身已加密)。
  5. 要防范重播攻击,请使用设备专用私钥对生物识别模板进行签名。对于高级加密标准 (AES),模板必须至少通过绝对文件系统路径、群组和生物识别 ID 进行签名,这样一来,相应模板文件便无法在其他设备上使用,并且无法用于在同一设备上注册的任何其他用户。例如,您将无法复制同一设备上其他用户的生物识别数据,也无法从其他设备复制生物识别数据。
  6. 使用 set_active_group() 函数提供的文件系统路径,或提供另一种能够在移除用户时一并清空所有用户模板数据的方法。强烈建议将生物识别模板文件以加密形式存储在提供的路径中。如果因安全隔离环境的存储要求导致这种做法不可行,请添加一些钩子,以确保在移除用户或清空设备数据时一并移除相关数据。

自定义

如果您的设备支持多种生物识别技术,您可以指定默认值。但是,您必须允许用户在“设置”中更改其首选生物识别技术。

验证

Android 9 更新了 FingerprintManager CTS 验证程序测试,以通过 BiometricPromptBoundKeysTest 测试 BiometricPrompt。对于其他生物识别技术,还没有正式的 CTS 或 CTS 验证程序测试。