Android WebView зашифрованный контент - PullRequest
3 голосов
/ 23 января 2012

У меня есть приложение, которое использует веб-просмотр для отображения контента, а вызовы Javascript контролируют мое приложение. Чтобы обеспечить уровень безопасности, я запутал код. Этого недостаточно, поскольку я хотел бы зашифровать файлы html и js, а затем расшифровать их во время выполнения. Я упаковал файл apk этими ресурсами, зашифрованными по алгоритму RC4. При загрузке файлов я расшифровываю файлы javascript, загружаю их, а затем дешифрую HTML-файл и загружаю его. Однако это не работает, так как веб-контент отображает сообщение в виде: веб-страница в data: text / html может быть временно недоступна или может быть перемещена навсегда, и т. Д., И т. Д. Я перегружен onLoadResource для того, чтобы увидеть, какой контент загружен, и я вижу, что он загружает контент Javascript, но загруженный контент также экранирован html.

Мои вопросы: 1. Как защитить файлы html и javascript (расположенные в папке активов), чтобы они не были доступны? 2. Если мой подход верен, кто-нибудь знает, что я делаю неправильно?

Спасибо!

Ниже приведен код, который расшифровывает и загружает ресурсы:

protected void loadWebContent() {
        checkEncryptionEnabled();
        loadJSFiles();
        logger.info("Loaded js ... going for html");
        loadAssetFile("www/index.html", "text/html");
    }

    private void loadJSFiles() {
        String[] jsFilesArray = { "app.js", "iscroll.js", "iui.js", "json.js" };
        for (String js : jsFilesArray) {
            loadAssetFile("www/js/" + js, "application/javascript");
        }
    }

    private void loadAssetFile(String filePath, String mimeType) {
        AssetManager assetMgr = getAssets();
        InputStream is = null;
        try {
            is = assetMgr.open(filePath);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] temp = new byte[512];
            int bytesRead = -1;
            while ((bytesRead = is.read(temp)) > 0) {
                baos.write(temp, 0, bytesRead);
            }
            byte[] encrypted = baos.toByteArray();
            String content = null;
            /**
             * true
             * */
            if (Config.ENCRYPTION_ENABLED) {
                byte[] decrypted = new RC4Encrypter("rc4_key").rc4(encrypted);
                content = new String(decrypted, "utf-8");
            } else {
                content = new String(encrypted, "utf-8");
            }

            /**
             * The webview to use
             * */
            if("application/javascript".equals(mimeType)) {
                webContent.loadUrl("javascript:" + content);
            } else {
                webContent.loadData(content, mimeType, "utf-8");
            }
        } catch (IOException ex) {
            logger.error(null, ex);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                }
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 20 января 2016

Шифрование данных в порядке, если вы также можете сохранить ключ шифрования в секрете, что не соответствует приведенному выше коду.Зашифрованный ключ дешифрования может быть легко обнаружен после декомпиляции файлов DEX, встроенных в APK.

Если вы хотите скрыть логику приложения в файлах HTML и JavaScript и если эта логика приложения не требует автономных возможностей, вы можете передать код этой логики приложения на сервер.

Отсюда у вас есть два варианта:

  1. Загружать код приложения динамически с сервера всякий раз, когда вам это нужно (и запускать код приложения на клиенте).
  2. Реализация логики приложения на стороне сервера, например, в виде веб-службы (и запуск кода приложения на сервере, клиент знает только, как вызвать веб-службу)

Короткий ответ на ваш первый вопрос: нет методологии или технологии, которая бы идеально защищала ваше приложение.Я рекомендую вам взглянуть на Как избежать реверс-инжиниринга APK-файла? для обзора возможных методов защиты.

0 голосов
/ 03 апреля 2013

нашел ответ на вопрос второго вопроса вместо: webContent.loadData(content, mimeType, "utf-8"); Я использовал: webContent.loadDataWithBaseURL("file:///android_asset/www/", content, mimeType, "utf-8", null); Содержание показывается без проблем ... Однако первый вопрос вроде стоит и не; но, учитывая, что ответа не было больше года, я подумаю, что шифрование данных в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...