连续多次按下后退按钮后,createConfirmDeviceCredentialIntent会解锁吗?

时间:2017-03-28 20:12:52

标签: android fingerprint

我最近在我的某个应用中实施了指纹认证。一切都按预期工作,除了我在测试时发现的这个问题。一些背景:我使用以下关键的gen参数生成了一个键:

KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                    .setUserAuthenticationRequired(true)
                    .setUserAuthenticationValidityDurationSeconds(80)
                    .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)

因此用户将保持身份验证80秒。每当应用程序需要重新验证用户时,它将检查密钥是否仍然有效,否则createConfirmDeviceCredentialIntent如果密钥超时,则会弹出系统屏幕提示用户验证其指纹或输入密码/图钉/图案。

问题:现在这个屏幕应该是不可取消的,但是如果我连续多次点击后退按钮或顶部箭头按钮,用户就会进入应用程序。有没有人有过这样的经历?

修改 这似乎只发生在我测试的三星设备上,它在Nexus和Google Pixel上运行良好。 这是使用的代码,它来自Google示例项目,使用createConfirmDeviceCredentialIntent。 这是检查密钥是否仍然有效的方法。

 protected boolean tryEncrypt() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                mKeyStore = KeyStore.getInstance("AndroidKeyStore");
                mKeyStore.load(null);
                SecretKey secretKey = (SecretKey) mKeyStore.getKey(KEY_NAME, null);
                mCipher = Cipher.getInstance(
                        KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/"
                                + KeyProperties.ENCRYPTION_PADDING_PKCS7);
                mCipher.init(Cipher.ENCRYPT_MODE, secretKey);
                mCipher.doFinal(SECRET_BYTE_ARRAY);
                return true;
            } catch (UserNotAuthenticatedException e) {
                // User is not authenticated, let's authenticate with device credentials.
                showAuthenticationScreen();
                return false;
            } catch (KeyPermanentlyInvalidatedException e) {
                return false;
            } catch (BadPaddingException | IllegalBlockSizeException | KeyStoreException |
                    CertificateException | UnrecoverableKeyException | IOException
                    | NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException e) {
                throw new RuntimeException(e);
            }
        }
        return false;
    }

如果密钥超时,则调用showEncryption方法:

  protected void showAuthenticationScreen() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Intent intent = getKeyguardManager().createConfirmDeviceCredentialIntent(null, null);
            if (intent != null) {
                startActivityForResult(intent, 1);
            }
        }
    }

0 个答案:

没有答案