生物识别

生物识别技术提供了一种更便捷但可能安全性较低的方式,用于通过设备确认您的身份。在分级身份验证模型下,主要身份验证(即基于知识因素的方式,如 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,该 API 为使用 BiometricPrompt 进行身份验证的应用提供本地化字符串。这些字符串旨在感知设备,并提供关于可以使用哪些身份验证类型的更多具体信息。
  • 包含屏下指纹传感器 (UDFPS) 支持。

Android 11

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

Android 10

  • 引入了 BiometricManager,开发者可以使用该类来查询生物识别身份验证的可用性。
  • 包含用于 BiometricPrompt 的指纹和人脸身份验证集成

Android 9

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

实现

为了确保用户和开发者获得无缝的生物识别体验,请将您的生物识别堆栈与 BiometricPromptBiometricManagerACTION_BIOMETRIC_ENROLL API 集成。具有生物识别传感器的设备必须遵守这些强度要求。此外,所有实现都必须通过 CtsBiometricsTestCases CTS 模块。

要将您的生物识别堆栈与 ACTION_BIOMETRIC_ENROLL API 集成,请执行以下操作

  1. 修改 BiometricEnrollActivity 以呈现您的注册流程。请注意,只有当您的生物识别符合要求的强度时,才能呈现它。如果您的设备支持多种生物识别方式,则此操作应呈现用户可以从中选择的列表。
BiometricPrompt architecture
图 1. BiometricPrompt 架构

HAL 实现指南

请遵循以下生物识别 HAL 指南,以确保生物识别数据不会泄露,并且在从设备中移除用户时会被移除

  • 确保永远无法从安全隔离环境(如 TEE 或安全元件)外部访问原始生物识别数据或衍生物(如模板)。所有存储的数据都必须使用只有 TEE(可信执行环境)知道的设备专用密钥进行加密。如果硬件支持,请限制硬件对安全隔离环境的访问,并使用 SELinux 策略对其进行保护。使通信通道(例如,SPI、I2C)仅可由安全隔离环境访问,并在所有设备文件上使用显式 SELinux 策略。
  • 生物识别数据采集、注册和识别必须在安全隔离环境内进行,以防止数据泄露和其他攻击。此要求仅适用于 3 级(以前称为“强”)和 2 级(以前称为“弱”) 生物识别技术。
  • 为了防止重放攻击,请使用设备专用的私钥对生物识别模板进行签名。对于高级加密标准 (AES),至少使用绝对文件系统路径、群组和生物识别 ID 对模板进行签名,以便模板文件在另一台设备上或对于在同一设备上注册它们的用户以外的任何人都无法操作。例如,防止从同一设备上的不同用户或其他设备复制生物识别数据。
  • 如果您需要在 TEE 外部存储数据,请使用 setActiveUser() HIDL 方法 提供的文件系统路径,或者提供另一种方法在移除用户时擦除所有用户模板数据。原因是保护用户数据不被泄露。不使用此路径的设备必须在移除用户后进行清理。CDD 要求对生物识别数据和衍生文件进行加密存储 - 尤其是在不位于 TEE 中的情况下。如果由于安全隔离环境的存储要求而不可行,请添加钩子以确保在移除用户或擦除设备时移除数据。请参阅 LockSettingsService.removeBiometricsForUser()

自定义

如果您的设备支持多种生物识别方式,用户应能够在设置中指定默认方式。除非用户明确覆盖,否则您的 BiometricPrompt 实现应首选 3 级(以前称为“强”) 生物识别作为默认方式,然后需要显示警告消息,解释与生物识别相关的风险(例如,您的照片可能会解锁您的设备

设备专用身份验证字符串

从 Android 12 开始,可通过 BiometricManager.Strings API 向开发者提供上下文身份验证字符串。您可以自定义此 API 返回的资源值,以实现设备专用字符串。如果您这样做,请确保为设备支持的所有语言区域翻译任何新字符串。此外,请确保保留以下属性


方法

字符串用途

要包含的身份验证类型

如果生物识别和屏幕锁定都可能

getButtonLabel()

触发 BiometricPrompt 的按钮的标签

已注册类型(如果可能),满足身份验证器要求

使用仅生物识别字符串(例如,“使用指纹”)

getPromptMessage()

身份验证期间在 BiometricPrompt 上显示的消息

已注册类型(如果可能),满足身份验证器要求

使用组合生物识别和屏幕锁定字符串(例如,“使用指纹或 PIN 码继续”)

getSettingName()

启用 BiometricPrompt 进行身份验证的设置名称

设备支持的所有类型(即使未注册),满足身份验证器要求

使用组合生物识别和屏幕锁定字符串(例如,“使用指纹或屏幕锁定”)

例如,考虑一个设备,它有一个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.1fingerprint@2.2face1.0),则它必须通过其相关的 VTS 测试(指纹人脸