开发者社区> 问答> 正文

密钥库“不受支持的保护参数”

我试图将SecretKey存储在Android KeyStore中,甚至直接遵循此处找到的文档:KeyProtection:GCM模式下用于加密/描述的AES密钥,该密钥仍然不起作用。

运行此命令时,似乎出现以下异常:

java.security.KeyStoreException:不支持的保护参数

我致电时会特别引发此异常keyStore.setEntry(...)。

如果有任何区别,我将在Samsung Galaxy S10上运行Android 10。

@RequiresApi(23)
private static KeyStore.ProtectionParameter getProtectionParameter() {
    return new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
            .build();
}

@RequiresApi(23)
private static SecretKey getSecretKey() throws Exception {
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null);

    if (keyStore.containsAlias(KEY_ALIAS)) {
        final KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore
                .getEntry(KEY_ALIAS, null);
        return secretKeyEntry.getSecretKey();
    }

    final KeyGenerator keyGenerator = KeyGenerator
            .getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(KEY_ALIAS,
            KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
            .build();

    keyGenerator.init(keyGenParameterSpec);
    SecretKey k = keyGenerator.generateKey();

    keyStore.setEntry(
        KEY_ALIAS,
        new KeyStore.SecretKeyEntry(k),
        getProtectionParameter()
    );

    return getSecretKey();
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-27 21:47:11 693 0
1 条回答
写回答
取消 提交回答
  • 事实证明,我KeyStore.getInstance和我所遇到的问题KeyGenerator.getInstance。其中一个正在使用KeyStore.getDefaultType(),而另一个正在使用AndroidKeyStore。更改此设置解决了这个unsupported protection parameter问题。

    此外,在修复该问题之后,我遇到了更新保护参数的问题。

    事实证明,代码的以下部分不正确

    SecretKey k = keyGenerator.generateKey();
    
    keyStore.setEntry(
        KEY_ALIAS,
        new KeyStore.SecretKeyEntry(k),
        getProtectionParameter()
    );
    

    由于generateKey()已将密钥插入密钥库,因此它将尝试两次将密钥插入密钥库。

    完整的工作代码如下所示

    @RequiresApi(23)
    private static SecretKey getSecretKey() throws Exception {
        KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
        keyStore.load(null, null);
    
        final KeyStore.SecretKeyEntry secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore
                    .getEntry(KEY_ALIAS, null);
        if (secretKeyEntry != null) {
            return secretKeyEntry.getSecretKey();
        }
    
        final KeyGenerator keyGenerator = KeyGenerator
                .getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
        final KeyGenParameterSpec keyGenParameterSpec = new KeyGenParameterSpec.Builder(KEY_ALIAS,
                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                .build();
    
        keyGenerator.init(keyGenParameterSpec);
        SecretKey k = keyGenerator.generateKey();
        return getSecretKey();
    }
    

    回答来源:Stack Overflow

    2020-03-27 21:47:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《用管控策略设定多账号组织全局访问边界》 立即下载
ICA安全标准组测试认证分享 立即下载
荷鲁斯 移动端第三方库安全检查引擎介绍 立即下载