Android KeyPairGenerator Оптимизация времени шифрования RSA для версий API 18+ - PullRequest
0 голосов
/ 30 января 2019

Мое требование - надежно хранить токен 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.

...