问题描述
我正在使用新的androidx.BiometricPromt
库来实现带指纹的身份验证。如果用户添加了新指纹或删除了一个指纹,我想使密钥失效。我正在创建这样的密钥:
fun getSecretKey(shouldCreate: Boolean): Key {
val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE)
keyStore.load(null)
return if (shouldCreate) {
createSecretKey(keyStore)
} else {
keyStore.getKey(ALIAS_BIOMETRICS,null)
}
}
private fun createSecretKey(keystore: KeyStore): Key {
val builder = KeyGenParameterSpec.Builder(
ALIAS_BIOMETRICS,KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(5)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
builder.setInvalidatedByBiometricEnrollment(true)
builder.setUserAuthenticationValidWhileOnBody(true)
}
val keyGenerator =
KeyGenerator.getInstance(keyAlgorithm,keystore.provider)
keyGenerator
.init(builder.build())
return keyGenerator.generateKey()
}
我正在开始像这样的生物识别扫描过程:
val info = BiometricPrompt.PromptInfo.Builder()
.setTitle(context.getString(R.string.biometric_dialog_title))
.setSubtitle(context.getString(R.string.biometric_dialog_subtitle))
.setNegativeButtonText(context.getString(R.string.biometric_dialog_cancel))
.build()
biometricPrompt = when (screen) {
is FragmentActivity -> BiometricPrompt(screen,{ it.run() },this)
is Fragment -> BiometricPrompt(screen,this)
else -> throw IllegalArgumentException("Screen type must be FragmentActivity or Fragment")
}
biometricPrompt?.authenticate(info)
我想启动biometricPromt?.authenticate(info,cryptoObject)
,但是在这种情况下,我需要初始化Cipher并抛出异常UserNotAuthenticated
。用户成功扫描生物特征之后,我将创建SecretKey并用于加密。然后,我要更改指纹(添加一些新指纹并删除)。解密过程像加密一样,但仅在获取密钥时,我不是在创建新密钥,而是从密钥库中获取它。尽管我更换了指纹,但一切正常。
如果用户更改了设备中的指纹,我想拒绝解密。如何使用androidx.BiometricPrompt库实现此功能?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)