我使用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)