我使用SecretKey对我的应用程序中的敏感数据进行加密。目前,我正在以DB64或SharedPrefs的Base64编码格式存储我的SecretKey,这不是在根电话上存储Secret的安全位置。因此,我想将我的SecretKey移到Android KeyStore。我面临的问题是,当我尝试使用Google的this sample code时,它期望使用的是PrivateKey而不是SecretKey。我想不出一种方法来将我的SecretKey存储在KeyStore中并获取它以供以后使用。我尝试了这个:

private static void writeSecretKeyToKeystore(SecretKey secretKey, Context context) {
KeyStore keyStore = null;
try {
  keyStore = KeyStore.getInstance("AndroidKeyStore");
  keyStore.load(null);
  KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);
  keyStore.setKeyEntry("Key", secretKeyEntry.getSecretKey().getEncoded(), null);
} catch (KeyStoreException e) {
  e.printStackTrace();
} catch (CertificateException e) {
  e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

当我尝试上述代码时,它将引发异常Operation not supported because encoding is unknown

任何示例代码都会有很大的帮助。

最佳答案

错误的
java.security.KeyStore可以存储对称 key 和非对称 key 。您只需要实例化KeyStore.SecretKeyEntry并将其传递给构造函数中的SecretKey,然后使用KeyStore#setEntry方法保存它:

keyStore.setEntry(
     "key1",
     new KeyStore.SecretKeyEntry(secretKey),
     new KeyProtection.Builder(KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
             .setBlockMode(KeyProperties.BLOCK_MODE_GCM)
             .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
             .build());

要取回它,请使用:
SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null);

更新
经过研究后,我很惊讶地发现AndroidKeyStore不支持对称 key 。 (请参阅讨论:https://groups.google.com/forum/#!topic/android-developers/gbmIRKRbfq8)

09-10 10:09