You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KeyPermanentlyInvalidatedException未触发问题求助

解决KeyPermanentlyInvalidatedException未触发的问题

我仔细看了你的代码和测试流程,这里有几个关键点可以帮你搞定异常未触发的问题:

1. 显式绑定生物识别变更与密钥失效逻辑

虽然官方文档提到,当setUserAuthenticationRequired(true)且未设置有效期(即每次使用私钥都需认证)时,默认会在指纹变更后让密钥失效,但部分设备或系统版本可能存在行为偏差。你需要在创建密钥对时显式添加setInvalidatedByBiometricEnrollment(true),确保密钥与当前指纹集合强绑定:

修改你的createKeyPair方法中的KeyGenParameterSpec.Builder配置:

mKeyPairGenerator.initialize(
    new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_SIGN)
        .setDigests(KeyProperties.DIGEST_SHA256)
        .setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
        .setUserAuthenticationRequired(true)
        // 显式指定:新增/删除指纹时让密钥永久失效
        .setInvalidatedByBiometricEnrollment(true)
        .build());

2. 修正测试流程

你的测试步骤需要注意一个细节:
创建密钥对后,完全退出APP(不要留在后台),再去系统设置新增指纹;重新打开APP调用initSignature,此时才会触发KeyPermanentlyInvalidatedException。如果在同一个APP会话内创建密钥后直接新增指纹,密钥库的状态可能未及时刷新,导致异常无法触发。

3. 失效密钥的最佳处理方式

当捕获到KeyPermanentlyInvalidatedException时,记得删除失效密钥并重新创建新的密钥对,避免后续操作持续失败:

catch (KeyPermanentlyInvalidatedException e) {
    // 删除失效的密钥条目
    try {
        mKeyStore.deleteEntry(KEY_NAME);
    } catch (KeyStoreException ex) {
        throw new RuntimeException("Failed to delete invalid key", ex);
    }
    // 重新创建适配新指纹集合的密钥对
    createKeyPair();
    return false;
}

额外检查项

  • 确保设备运行Android 6.0(API 23)及以上版本,KeyPermanentlyInvalidatedException是从该版本开始引入的
  • 确认设备已设置安全锁屏(PIN/图案/密码),要求用户认证的密钥必须依赖安全锁屏才能生效

内容的提问来源于stack exchange,提问作者hoc nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:07:31