AndroidKeyStore getEntry постоянно завершается ошибкой после определенного момента
Я использую AndroidKeyStore для генерации пары ключей RSA, которые используются для шифрования / дешифрования внутренних данных.
Код, который делает это следующим образом - он пытается получить существующую пару ключей RSA (через псевдоним). Если ничего не существует, он пытается создать новый. код как -
private void initializePublicPrivateKeys(){
try
{
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(APP_RSA_,KEY_PAIR_SECRET_ALIAS, null);
_app_privateRSAKey = entry.getPrivateKey();
_app_publicRSAKey = entry.getCertificate().getPublicKey();
}
catch(Exception e){
}
}
private void initializeRSAKeyPairs() {
initializePublicPrivateKeys();
boolean isKeyNotGenerated = _app_privateRSAKey == null || _app_publicRSAKey == null;
if(isKeyNotGenerated)
{
//Check here, if we already stored some data with previous RSA key pair - if a entry is present in SharedPreference then that would mean we had previously generated a RSA key pair and the entry is in-turn encrypted by this key pair.
generateAppRSAPublicPrivateKeys();
initializePublicPrivateKeys();// initialize it again , since we have new keys generated.
}
}
@TargetApi(18)
private void generateAppRSAPublicPrivateKeys(){
Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
// the certificate created would be valid for 25 years. This is just a random value.
cal.add(Calendar.YEAR, 25);
Date end = cal.getTime();
try{
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
Context appContext = getApplicationContext();
KeyPairGeneratorSpec.Builder keyPairGeneratorBuilder =
new KeyPairGeneratorSpec.Builder(appContext)
.setAlias("myrsaalias")
.setStartDate(now)
.setEndDate(end)
.setSerialNumber(BigInteger.valueOf(1))
.setSubject(new X500Principal(String.format("CN=%s, OU=%s", "myrsaalias",
appContext.getApplicationInfo().packageName)));
if(Build.VERSION.SDK_INT >= 19){
keyPairGeneratorBuilder.setKeySize(2048);
}
generator.initialize(keyPairGeneratorBuilder.build());
generator.generateKeyPair();
}
catch(Exception e){
e.printStackTrace();
throw new IllegalArgumentException("Failed to generate RSA Public Private Key pair");
}
}
Этот код работает нормально. Как только пара ключей сгенерирована, я использую их для шифрования / дешифрования данных (сохраняю эти данные в общем предпочтении), НО после определенного момента времени (после некоторого перезапуска приложения) функция initializePublicPrivateKeys не может получить пары ключей. (После этой точки последовательно отказывает), и поэтому любые данные, которые хранятся в общем предпочтении в зашифрованном виде, теряются, поскольку у меня нет соответствующего открытого ключа для его расшифровки. (если я сгенерирую новый, тогда, я думаю, это было бы иначе и вернуло бы неправильные результаты, когда я расшифровал данные)
Мне было интересно, в каких случаях эта функция initializePublicPrivateKeys может завершиться ошибкой?
PS: пока я не могу зафиксировать детали исключения, потому что проблема возникает на каком-то клиентском устройстве, к которому у меня нет доступа, и мне нужно самому определить источник проблемы. Кроме того, пароль устройства или PIN-код не менялись в течение этого периода (я подтвердил это с моим клиентом)
заранее спасибо,