【发布时间】:2016-08-11 03:33:48
【问题描述】:
我使用SecretKey 来加密我的应用程序中的敏感数据。目前,我将我的 SecretKey 以 Base64 编码格式存储在 DB 或 SharedPrefs 中,这不是在有根手机上存储 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。
任何示例代码都会有很大帮助。
【问题讨论】:
-
尝试以下操作:keyStore.setEntry("Key", secretKeyEntry, null);
-
它不会编译,说
Wrong 2nd argument type. Found 'SecretKeyEntry'; required 'byte[]'。 -
请将“setKeyEntry”更改为“setEntry”。
-
该死!我现在把它改成了
setEntry,我看到了这个异常java.security.KeyStoreException: Entry must be a PrivateKeyEntry or TrustedCertificateEntry; was SecretKeyEntry: algorithm - AES
标签: android encryption keystore android-keystore secret-key