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

Android密钥库需要身份验证,不是通过指纹解锁,而是仅通过pin解锁?,android,android-keystore,android-fingerprint-api,key-generator,Android,Android Keystore,Android Fingerprint Api,Key Generator,编辑:这似乎是特定于设备的。我有一个模拟器,它可以在上面发生这种情况,还有一个可以按照我所期望的方式工作。我希望有一个普遍的答案,但也许没有 经历了一些我觉得有点奇怪的事情。我创建了一个需要用户凭据的AndroidKeyStore。因此,当我尝试使用该密钥加密时,会出现异常“UserNotAuthenticatedException”,非常完美 然后启动确认设备凭据: val keyguardManager = requireContext().getSystemService(Context.

编辑:这似乎是特定于设备的。我有一个模拟器,它可以在上面发生这种情况,还有一个可以按照我所期望的方式工作。我希望有一个普遍的答案,但也许没有

经历了一些我觉得有点奇怪的事情。我创建了一个需要用户凭据的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或指纹解锁后,我返回成功状态。但是,当我现在尝试再次使用密钥库时:

如果我在凭证屏幕上使用了我的PIN,我就可以使用密钥库了,没有问题

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

    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()

谢谢,这是一个特定于设备的错误。无论出于何种原因,在这种情况下,我使用的测试设备不允许指纹解锁。与其他设备一样,它也能正常工作。

这是什么设备?你所描述的绝对有效。我怀疑是一个特定于设备的错误。啊,是的,又忘了对此发表评论。它最终确实是一个特定于设备的问题。我只能在那个特定的设备上重新创建它,就像在其他设备上预期的那样工作。谢谢你的提醒。