Я хотел бы надежно хранить некоторые уязвимые строки в Android KeyStore. Я получаю строки с сервера, но у меня есть прецедент, который требует, чтобы я продолжал их. KeyStore разрешает доступ только из того же UID, что и для моего приложения, и будет шифровать данные с помощью главного пароля устройства, поэтому я понимаю, что мне не нужно делать какое-либо дополнительное шифрование для защиты моих данных. Моя проблема в том, что мне не хватает информации о том, как писать данные. Код, который у меня ниже, работает отлично, если вызов KeyStore.store(null) опущен. Этот код выходит из строя, и пока я не могу хранить данные после их добавления в KeyStore, я не могу его сохранить.
Я думаю, что мне не хватает чего-то о KeyStore API, но я не знаю, что. Любая помощь ценится!
String metaKey = "ourSecretKey";
String encodedKey = "this is supposed to be a secret";
byte[] encodedKeyBytes = new byte[(int)encodedKey.length()];
encodedKeyBytes = encodedKey.getBytes("UTF-8");
KeyStoreParameter ksp = null;
//String algorithm = "DES";
String algorithm = "DESede";
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm);
SecretKeySpec secretKeySpec = new SecretKeySpec(encodedKeyBytes, algorithm);
SecretKey secretKey = secretKeyFactory.generateSecret(secretKeySpec);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);
keyStore.setEntry(metaKey, secretKeyEntry, ksp);
keyStore.store(null);
String recoveredSecret = "";
if (keyStore.containsAlias(metaKey)) {
KeyStore.SecretKeyEntry recoveredEntry = (KeyStore.SecretKeyEntry)keyStore.getEntry(metaKey, ksp);
byte[] bytes = recoveredEntry.getSecretKey().getEncoded();
for (byte b : bytes) {
recoveredSecret += (char)b;
}
}
Log.v(TAG, "recovered " + recoveredSecret);