Мое требование - надежно хранить токен JWT с помощью Android Keystore для последующего извлечения.Я использовал следующий код для поддержки более старых API (18+) для генерации пары ключей и шифрования
KeyPairGenerator
private void generateKeyForAPIBelowM(final String alias){
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
end.add(Calendar.YEAR, 50);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(mContext)
.setAlias(alias)
.setSubject(new X500Principal("CN=" + alias))
.setSerialNumber(BigInteger.ONE)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator
.getInstance("RSA",ANDROID_KEY_STORE);
keyPairGenerator.initialize(spec);
keyPairGenerator.generateKeyPair();
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
}
Шифрование
generateKeyForAPIBelowM(alias);
cipher = Cipher.getInstance("RSA/ECB/NoPadding", "AndroidOpenSSL");
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipher.doFinal(textToEncrypt.getBytes("UTF-8"));
Моя проблема заключается в следующемшифрование занимает около 3-15 секунд для генерации зашифрованного ключа на устройстве под управлением Android 4.4 (API 19).Но дешифрование происходит почти сразу.
Мне кажется, что затраченное время намного выше по сравнению с шифрованием AES
и AES/GCM/NoPadding
в API, которые превосходят Android M.
Может ли это занять время?считается нормальным для шифрования RSA
или я должен что-то сделать для улучшения логики?
Я пытался изменить преобразование на RSA/ECB/PKCS1Padding
, но не вижу какой-либо существенной разницы.
Если кто-либоинтересно, я сослался на следующий код для моей реализации URL
Спасибо в Advanced.