Android 需要身份验证的密钥库,不是通过指纹解锁而是通过 pin 解锁?

Android Keystore that requires authentication, not unlocked by fingerprint but by pin only?

编辑:这似乎是特定于设备的。我有一个模拟器可以发生这种情况,还有一个可以按我的预期工作。想要一个通用的答案,但也许没有?

经历了一些我认为有点奇怪的事情。我创建了一个需要用户凭据的 AndroidKeyStore。因此,当我尝试使用该密钥加密时,我得到异常 "UserNotAuthenticatedException",完美。

然后我启动确认设备凭据:

val keyguardManager = requireContext().getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
        val intent = keyguardManager.createConfirmDeviceCredentialIntent(("Test"),"This is the description")
        if (intent != null)
            startActivityForResult(intent, AUTHENTICATION_REQUEST)

这很完美,在使用 PIN 或指纹解锁后的 onActivityResult 上,我恢复了成功状态。但是,当我现在尝试再次使用密钥库时:

如果我在凭据屏幕上使用了我的 PIN,我可以毫无问题地使用密钥库。

如果我在凭据屏幕上使用了我的指纹,它会再次抛出 "UserNotAuthenticatedException"。我基本上可以用指纹无限循环。我是否缺少允许使用指纹的设置或设置?我能够解锁 phone 本身,指纹没有问题,只是我无法通过这个密钥库。

    val keyGenerator =
                    KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
                val builder = KeyGenParameterSpec.Builder(
                    alias,
                    KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
                )
     builder.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                        .setUserAuthenticationRequired(userAuthenticationRequired)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                        builder.setUserAuthenticationValidityDurationSeconds(
                            userAuthenticationValidityDurationSeconds
                        )
keyGenerator.init(builder.build())
            keyGenerator.generateKey()

谢谢

这是一个特定于设备的错误。无论出于何种原因,在这种情况下,我拥有和正在使用的测试设备不允许指纹解锁。它在其他设备上按预期工作。