将对称密钥导入Android Keystore(外部生成的密钥)

时间:2019-05-31 15:06:39

标签: android keystore android-keystore

我尝试使用以下代码将生成的密钥导入Android Keystore,如本示例所示:https://developer.android.com/reference/kotlin/android/security/keystore/KeyProtection

  final SecretKey aesKey = new SecretKeySpec(myKeyByteArray, 0, myKeyByteArray.length, "AES");
  final KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
  keyStore.load(null);
  keyStore.setEntry(
          "my_key_alias",
          new KeyStore.SecretKeyEntry(aesKey),
          new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
         .setBlockMode(KeyProperties.BLOCK_MODE_GCM)         
         .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
         .build());

但是,setEntry方法失败,并显示:java.security.KeyStoreException: Failed to import secret key. Keystore error code: -65536 API级别28会发生这种情况。

令人惊讶的是,如果我使用以下代码生成SecretKey,则密钥导入将起作用:

final KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(AES_KEY_LEN);
final SecretKey aesKey = keyGenerator.generateKey();
....

请注意,此KeyGenerator不会在安全硬件内生成密钥,而只是在应用程序进程内生成随机密钥。

如何将外部生成的对称密钥导入Android密钥存储区? 我是否需要使用一些公私钥对的变通办法来加密对称密钥?

1 个答案:

答案 0 :(得分:0)

我在Android Studio虚拟设备(API 28)上测试了第一个代码段。 引发了如下异常:

java.security.KeyStoreException:无法导入密钥。密钥库错误代码:-6

此代码段对您有用吗?