BiometricPrompt认证成功后Cipher.init抛出UserNotAuthenticatedException原因排查
可能触发该问题的开发环境变动原因
- Android Gradle Plugin(AGP)版本升级
新版AGP默认启用的R8优化/混淆规则可能误剪裁Android安全库相关类的元信息,或是篡改KeyGenParameterSpec构建时传入的userAuthenticationValidityDurationSeconds等参数值,导致密钥实际未按预期配置时效规则,即使在认证有效期内调用cipher.init也无法通过校验。如果未显式配置Android Keystore、BiometricPrompt相关类的保留规则,升级AGP后极容易触发该问题。 - Biometric认证依赖库隐性升级
若项目中生物认证依赖使用了动态版本声明(如androidx.biometric:biometric:1.+),Gradle同步时会自动拉取最新版库。1.2.0及更高版本的Biometric库调整了「允许回退到设备凭据」场景下的授权传递逻辑:通过设备凭据完成认证后,不再默认给配置了时效的密钥授权,仅生物认证的授权结果会被正常传递到Keystore校验环节。 - compileSdk/targetSdk版本被动升高
更新Android Studio后同步项目时,可能被默认升级compileSdk到33及以上版本。高API级别的Android Keystore收紧了密钥授权校验逻辑:userAuthenticationValidityDurationSeconds生效要求认证会话和密钥生成的上下文严格匹配,此前低版本中允许的宽松校验逻辑不再生效。 - 项目JDK版本升级
若调整了项目使用的JDK版本到11或17,部分旧版Android Keystore交互逻辑在高版本JDK编译下会出现参数序列化异常,导致密钥生成时的用户认证相关配置未正确写入系统Keystore,最终触发授权校验失败。 - 应用自动备份被默认开启
新版AGP会默认开启android:allowBackup="true"配置,如果在不同设备/模拟器间同步安装应用,绑定了原设备的Keystore密钥会被备份恢复,而跨设备恢复的密钥会永久失效,无论是否完成认证都会抛出UserNotAuthenticatedException。
内容的提问来源于stack exchange,提问作者Aldinjo
相关产品推荐
相关产品推荐

