You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android KeyGenerator抛出ProviderException问题(vivo 1907设备)

vivo 1907(Android 12)设备指纹传感器密钥生成异常

设备信息

  • 型号:vivo 1907
  • 产品:1907
  • 设备:1907
  • SDK版本:31
  • Android版本:12

问题说明

仅在vivo 1907设备上调用指纹传感器时,出现密钥生成失败的异常,根因提示为Keystore not initialized(密钥库未初始化)。

相关代码片段

private boolean generateKey() {
    try {
        keyStore = KeyStore.getInstance("AndroidKeyStore");
    } catch (Exception e) {
        e.printStackTrace();
        LogManager.error(TAG + " :: " + " generateKey(): "
                + " Exception - " + e.getMessage()
        );
        return false;
    }

    KeyGenerator keyGenerator;
    try {
        keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    }
    catch (NoSuchAlgorithmException | NoSuchProviderException e) {
        e.printStackTrace();
        LogManager.error(TAG + " :: " + " generateKey(): "
                + " Error."
                + " Setting key algorithm failed."
                + " Exception - " + e.getMessage()
        );
        return false;
    }

    try {
        keyStore.load(null);
        keyGenerator.init(new
                KeyGenParameterSpec.Builder(KEY_NAME,
                KeyProperties.PURPOSE_ENCRYPT |
                        KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                // 要求用户通过指纹认证来授权密钥的每次使用
                .setUserAuthenticationRequired(true)
                .setEncryptionPaddings(
                        KeyProperties.ENCRYPTION_PADDING_PKCS7)
                .build());
        keyGenerator.generateKey();
    }
    catch (NoSuchAlgorithmException |
            InvalidAlgorithmParameterException
            | CertificateException | IOException e) {
        LogManager.error(TAG + " :: " + " generateKey(): "
                + " Error."
                + " Generating key failed."
                + " Exception - " + e.getMessage()
        );

        return false;
    }

    return true;
}

异常栈信息(翻译后)

java.security.ProviderException: 密钥库密钥生成失败
    at android.security.keystore2.AndroidKeyStoreKeyGeneratorSpi.engineGenerateKey(AndroidKeyStoreKeyGeneratorSpi.java:413)
    at javax.crypto.KeyGenerator.generateKey(KeyGenerator.java:612)
    at com.qbrik.fingerPrintManager.FingerprintService.generateKey(FingerprintService.java:442)
    at com.qbrik.fingerPrintManager.FingerprintService.initService(FingerprintService.java:296)
    at com.qbrik.shaktiapp.LoginPasscodeActivity.triggerFingerprintService(LoginPasscodeActivity.java:442)
    at com.qbrik.shaktiapp.LoginPasscodeActivity.onShaktiCreate(LoginPasscodeActivity.java:375)
    at com.qbrik.ShaktiBaseActivity.onCreate(ShaktiBaseActivity.java:338)
    at android.app.Activity.performCreate(Activity.java:8365)
    at android.app.Activity.performCreate(Activity.java:8343)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1379)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3912)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4096)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2441)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:233)
    at android.os.Looper.loop(Looper.java:334)
    at android.app.ActivityThread.main(ActivityThread.java:8396)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
Caused by: android.security.KeyStoreException: 密钥库未初始化
    at android.security.KeyStore2.getKeyStoreException(KeyStore2.java:332)
    at android.security.KeyStoreSecurityLevel.handleExceptions(KeyStoreSecurityLevel.java:57)
    at android.security.KeyStoreSecurityLevel.generateKey(KeyStoreSecurityLevel.java:145)
    at android.security.keystore2.AndroidKeyStoreKeyGeneratorSpi.engineGenerateKey(AndroidKeyStoreKeyGeneratorSpi.java:400)
    ... 22 more

解决方案建议

  • 单独捕获KeyStoreException:扩展catch块,捕获该异常并判断是否为"Keystore not initialized",若出现则尝试重新加载KeyStore后重试密钥生成
  • 检查密钥是否已存在:在生成新密钥前,先通过keyStore.containsAlias(KEY_NAME)检查密钥是否已存在,避免重复触发生成逻辑
  • 添加重试机制:针对vivo设备的Keystore初始化延迟问题,添加有限次数的重试逻辑,每次重试前等待短时间(如500ms)
  • 确认硬件安全模块状态:在调用密钥生成前,确保设备的安全硬件已就绪,可以通过KeyStore.getInstance("AndroidKeyStore").load(null)的返回状态判断,或使用系统API检查硬件可用性

内容的提问来源于stack exchange,提问作者raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:05:20