Есть ли способ обойти ужасную производительность SecretKeyFactory с LVL и AESObfuscator?

Я хочу использовать новые возможности лицензирования (LVL) с Android Marketplace, но у меня проблемы с производительностью стандартного AESObfuscator. В частности, для запуска конструктора на устройстве требуется несколько секунд (чистая агония на эмуляторе). Поскольку этот код необходимо запускать даже для проверки кешированных ответов на лицензии, он серьезно затрудняет проверку лицензии при запуске.

Запуск примера приложения LVL, здесь ' s мое варварское профилирование конструктора AESObfuscator:

public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
        Log.w("AESObfuscator", "constructor starting");
        try {
            Log.w("AESObfuscator", "1");
            SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
            Log.w("AESObfuscator", "2");
            KeySpec keySpec =
                new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
            Log.w("AESObfuscator", "3");
            SecretKey tmp = factory.generateSecret(keySpec);
            Log.w("AESObfuscator", "4");
            SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
            Log.w("AESObfuscator", "5");
            mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
            Log.w("AESObfuscator", "6");
            mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
            Log.w("AESObfuscator", "7");
            mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
            Log.w("AESObfuscator", "8");
            mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
        } catch (GeneralSecurityException e) {
            // This can't happen on a compatible Android device.
            throw new RuntimeException("Invalid environment", e);
        }
        Log.w("AESObfuscator", "constructor done");
    }

Результат на Nexus One:

09-28 09:29:02.799: INFO/System.out(12377): debugger has settled (1396)
09-28 09:29:02.988: WARN/AESObfuscator(12377): constructor starting
09-28 09:29:02.988: WARN/AESObfuscator(12377): 1
09-28 09:29:02.999: WARN/AESObfuscator(12377): 2
09-28 09:29:02.999: WARN/AESObfuscator(12377): 3
09-28 09:29:09.369: WARN/AESObfuscator(12377): 4
09-28 09:29:09.369: WARN/AESObfuscator(12377): 5
09-28 09:29:10.389: WARN/AESObfuscator(12377): 6
09-28 09:29:10.398: WARN/AESObfuscator(12377): 7
09-28 09:29:10.398: WARN/AESObfuscator(12377): 8
09-28 09:29:10.409: WARN/AESObfuscator(12377): constructor done
09-28 09:29:10.409: WARN/ActivityManager(83): Launch timeout has expired, giving up wake lock!
09-28 09:29:10.458: INFO/LicenseChecker(12377): Binding to licensing service.

7 секунд взлома (около 20 в эмуляторе, тьфу). Я могу включить его в AsyncTask, но там от этого мало пользы, так как приложение не может работать, пока я не проверил лицензию. Все, что я получаю, - это симпатичная, красивая семисекундная полоса прогресса, пока пользователь ждет, пока я проверю лицензию.

Есть идеи? Запустить мой собственный обфускатор с помощью чего-то более простого, чем AES, чтобы кэшировать мои собственные ответы на лицензию?

9
задан rene 14 June 2015 в 13:08
поделиться