我最近在我的某个应用中实施了指纹认证。一切都按预期工作,除了我在测试时发现的这个问题。一些背景:我使用以下关键的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);
}
}
}