12、Android 10 强生物识别:BIOMETRIC_STRONG vs BIOMETRIC_WEAK、设备凭据回退、allowDeviceCredential参数

好,咱们今天聊点硬核的。Android 10 在生物识别这块,其实做了一次比较大的「分层」。说白了,就是告诉开发者:指纹也有三六九等,你得知道怎么用。

我刚开始接触 Android 10 的生物识别 API 时,也有点懵。什么强生物识别、弱生物识别,还有设备凭据回退…… 嗯,别急,咱们一个一个拆开讲。

BIOMETRIC_STRONG vs BIOMETRIC_WEAK:到底差在哪?

先问一个问题:你手机上的指纹识别,和支付宝的指纹支付,用的是同一个指纹吗?

从硬件角度看,可能是同一个。但从系统安全等级看,不一定。

Android 10 把生物识别分成了两个等级:

  • BIOMETRIC_STRONG:符合 Android 强生物识别要求,通过了 Android 兼容性定义文档(CDD)的严格测试。说白了,就是硬件级的安全,密钥存储在 TEE(可信执行环境)或更高安全级别的芯片中。
  • BIOMETRIC_WEAK:安全性相对较低,可能是软件层面的识别,或者硬件安全等级不够。比如一些低端手机的指纹、2D 人脸识别,都属于这一类。

我个人的习惯是:涉及支付、登录、敏感数据解密,必须用 BIOMETRIC_STRONG。普通的应用解锁、个性化推荐,用 BIOMETRIC_WEAK 就够了。

核心区别一句话:STRONG 是硬件级安全,WEAK 是软件级或低硬件安全。前者能用于加密操作,后者只能用于 UI 解锁。

设备凭据回退:用户忘了指纹怎么办?

你想想看,用户设置了指纹解锁,但某天手指脱皮了、沾水了,或者就是不想用指纹了。这时候怎么办?

Android 10 提供了一个机制:设备凭据回退。也就是当生物识别失败或不可用时,允许用户用 PIN 码、图案或密码来替代。

我在项目中遇到过这种情况:用户连续 5 次指纹识别失败,系统直接锁定了生物识别。如果没有设备凭据回退,用户就只能干瞪眼。所以,我建议所有涉及生物识别的应用,都加上这个回退机制

allowDeviceCredential 参数:怎么开启回退?

这个参数是 BiometricPromptBuilder 中的一个选项。看代码:

// 创建 BiometricPrompt 实例
BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(context)
    .setTitle("验证指纹")
    .setSubtitle("请触摸指纹传感器")
    .setDescription("使用指纹或设备密码验证身份")
    .setAllowedAuthenticators(
        BiometricManager.Authenticators.BIOMETRIC_STRONG
        | BiometricManager.Authenticators.DEVICE_CREDENTIAL
    )
    .build();

// 启动认证
biometricPrompt.authenticate(
    new BiometricPrompt.CryptoObject(cipher),
    cancellationSignal,
    authenticationCallback
);

注意看 setAllowedAuthenticators 方法。这里传了两个值:

  • BIOMETRIC_STRONG:允许使用强生物识别
  • DEVICE_CREDENTIAL:允许使用设备凭据(PIN/图案/密码)

这两个用「或」操作符连接,表示「只要满足其中一个就行」。

小技巧:如果你只传了 BIOMETRIC_STRONG,系统不会弹出设备凭据回退选项。用户指纹失败后,只能重试或取消。所以,想要回退功能,必须加上 DEVICE_CREDENTIAL

三种认证方式的对比

为了方便你理解,我整理了一个表格:

认证方式 安全等级 典型场景 是否需要硬件支持
BIOMETRIC_STRONG 支付、敏感数据解密 是(TEE/安全芯片)
BIOMETRIC_WEAK 应用解锁、个性化推荐 否(软件即可)
DEVICE_CREDENTIAL 生物识别失败时的回退 否(系统级)

我曾经踩过的坑

嗯,这里分享一个真实案例。有一次,我在做一款金融类 App,要求必须用强生物识别。我直接用了 BIOMETRIC_STRONG,没加 DEVICE_CREDENTIAL

结果测试反馈:用户手机不支持强生物识别(比如一些老款手机),直接弹了个错误提示,连回退选项都没有。用户只能干瞪眼。

后来我改成了:

.setAllowedAuthenticators(
    BiometricManager.Authenticators.BIOMETRIC_STRONG
    | BiometricManager.Authenticators.DEVICE_CREDENTIAL
)

这样,即使手机不支持强生物识别,用户也能用 PIN 码或密码完成认证。用户体验好了很多。

注意:如果你同时传了 BIOMETRIC_WEAKDEVICE_CREDENTIAL,系统会优先尝试生物识别。如果生物识别失败或不可用,才会弹出设备凭据界面。这个顺序是系统控制的,开发者无法干预。

知识体系结构图

下面这张图,帮你理清 Android 10 生物识别的核心逻辑:

Android 10 生物识别认证体系 BiometricPrompt BIOMETRIC_STRONG 硬件级安全(TEE) 支付/敏感数据解密 BIOMETRIC_WEAK 软件级安全 应用解锁/个性化 DEVICE_CREDENTIAL PIN/图案/密码 生物识别失败时回退 setAllowedAuthenticators() 组合使用

总结一下

Android 10 的生物识别,说白了就是给了开发者一把「安全尺子」。你可以根据业务需求,选择不同等级的认证方式。

  • BIOMETRIC_STRONG:安全第一,适合金融、支付类场景
  • BIOMETRIC_WEAK:方便快捷,适合非敏感场景
  • DEVICE_CREDENTIAL:兜底方案,保证用户体验

我个人建议:能用 STRONG 就用 STRONG,但一定要加上 DEVICE_CREDENTIAL 作为回退。这样既保证了安全,又不会把用户卡死。

好了,这一节的内容就到这。记住,生物识别不是「有就行」,而是「用对才行」。


公众号:蓝海资料掘金营,微信deep3321