O AndroidKeyStore getEntry está constantemente falhando após determinado ponto
Estou usando o AndroidKeyStore para gerar um par de chaves RSA, usado para criptografar / descriptografar os dados internos.
O código que faz isso é o seguinte - ele tenta recuperar o par de chaves RSA existente (por meio de um alias). Se não existir, ele tenta gerar um novo. o código é como -
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");
}
}
Esse código funciona bem. Depois que o par de chaves é gerado, eu os uso para criptografar / descriptografar dados (armazenar esses dados em preferência compartilhada) MAS, após certo ponto do tempo (após algum relançamento do aplicativo), a função initializePublicPrivateKeys falha ao recuperar os pares de chaves. falha consistentemente) e, portanto, o que quer que os dados armazenados na preferência compartilhada no formato criptografado sejam perdidos, pois eu não tenho a chave pública correspondente para descriptografar isso. (se eu gerar um novo, acho que isso seria diferente e retornaria resultados incorretos ao descriptografar os dados)
Eu queria saber em que casos esta função initializePublicPrivateKeys pode falhar?
PS: por enquanto, não consigo capturar os detalhes da exceção porque o problema está ocorrendo em algum dispositivo do cliente ao qual não tenho acesso e preciso descobrir a origem do problema. Além disso, a senha do dispositivo ou o PIN não são alterados durante esse período (confirmei isso com meu cliente)
desde já, obrigado,