2012-01-23 6 views
3

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

Мои вопросы: 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) { 
       } 
      } 
     } 
    } 
+0

Вопрос: Вы заметили задержку при этом? У меня также есть компилятор, который сжимает весь контент до max и объединяет файлы css, js (скомпилированные с компилятором Google закрытия), изображения (base64) и т. Д. В один файл. Это работает очень хорошо. Размер файла составляет, например, 1,2 МБ. Размер кажется без проблем, он быстро загружается. Но когда я использовал шифрование, подобное вам, полезно распаковать его в памяти. Представляет ли это наводнение? – Codebeat

ответ

0

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

0

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

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

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

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

Короткий ответ к вашему первому вопросу является то, что нет никакой методологии или технологии, чтобы полностью защитить ваше приложение. Я рекомендую вам взглянуть на How to avoid reverse engineering of an APK file? для обзора возможных способов защиты.