问题描述

手机更换指纹时后,之前配合使用的密钥Cipher失效,爆出

Key permanently invalidated  (该密钥已被永久无效)错误

然后返回给BiometricPrompt 使用时报错:

Caused by: java.lang.IllegalStateException: Crypto primitive not initialized

解决办法

对已经报错的密钥,进行删除操作:

 _keystore.deleteEntry(KEY_NAME);

而后重新获取新的密钥

   /**     * 获取key     */  Key GetKey() throws Exception {        Key secretKey;        if (!_keystore.isKeyEntry(KEY_NAME)) {           return CreateKey();        }        secretKey = _keystore.getKey(KEY_NAME, null);        return secretKey;    }        /**     * 创建key     */    @RequiresApi(api = Build.VERSION_CODES.M)    Key CreateKey() throws Exception {        Log.e(TAG, "CreateKey ");        KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM, KEYSTORE_NAME);        KeyGenParameterSpec keyGenSpec =                new KeyGenParameterSpec.Builder(KEY_NAME,                        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)                        .setBlockModes(BLOCK_MODE)                        .setEncryptionPaddings(ENCRYPTION_PADDING)                        .setUserAuthenticationRequired(true)                        .build();        keyGen.init(keyGenSpec);        SecretKey secretKey = keyGen.generateKey();        return secretKey;    }

并进行初始化(关键)

Cipher createCipher(boolean retry, int operMode, byte[] iv) throws Exception {        Key key = GetKey();        Cipher cipher = Cipher.getInstance(TRANSFORMATION);        try {            if (operMode == Cipher.ENCRYPT_MODE) {                cipher.init(Cipher.ENCRYPT_MODE, key);            } else if (operMode == Cipher.DECRYPT_MODE) {                IvParameterSpec ivSpec = new IvParameterSpec(iv);                cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);            }        } catch (KeyPermanentlyInvalidatedException e) {            // 该密钥已被永久无效 Key permanently invalidated            Log.e(TAG, "createCipher: "+e.getMessage() );            _keystore.deleteEntry(KEY_NAME);            if (retry) {                 return createCipher(false, operMode, iv);            } else {                throw new Exception("Could not create the cipher for fingerprint authentication.", e);            }        }        return cipher;    }

并且非常要注意的一点是, 当返回的时候, 重复执行的createCipher方法 递归, 递归返回时的结果值,第一次运行返回的是第一次执行的, 如果在retry 之后没有进行return createCipher 那么即使执行了第二次,返回的依旧是第一次的值!

有问题可随时联系QQ, 7641436

需要Android 最新X库 指纹识别(同时兼容api23&api28)并配合AndroidKetStore密钥存储的可以私聊我。

更多相关文章

  1. Android O指纹识别解析
  2. android获得密钥
  3. Android获取activity的所有子view(使用到递归)
  4. Android文件递归遍历
  5. android 生成密钥 签名
  6. Android google地图开发的前期准备(MD5和密钥的获取)
  7. android指纹识别、拼图游戏、仿MIUI长截屏、bilibili最美创意等
  8. devexpress TreeList递归的实例代码
  9. c语言递归算法怎么实现

随机推荐

  1. Android(安卓)- JNI 串口通信
  2. AppWidgetProvider
  3. 适配Android(安卓)N (7.0)需要解决的问题汇
  4. 定制Oreo 初步
  5. Android(安卓)代码混淆
  6. 事件分发机制(View)
  7. 1. 1 布局管理器
  8. Android(安卓)Studio使用gradle导出jar包
  9. Android(安卓)TabLayout控件
  10. ViewStub must have a valid layoutResou