2012-01-23 70 views
3

我有一個應用程序使用webview來顯示內容,而Javascript調用是我的應用程序的控制器。 爲了提供安全級別,我混淆了代碼。這還不夠,因爲我想加密html和js文件,然後在運行時解密它們。我用這些用RC4算法加密的資源打包了apk文件。加載文件時,我解密JavaScript文件,加載它們,然後解密該html文件並加載它。然而,這不起作用,因爲webcontent以下列形式顯示消息:data: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

問題:這樣做時你注意到延遲嗎?我還構建了一個「編譯器」,將所有內容壓縮到最大,並將css,js文件(使用Google閉包編譯器編譯),圖像(base64)等組合到一個文件中。這工作得很好。該文件的大小是例如1.2MB。大小似乎沒有問題,它加載速度很快。但是當我像你一樣使用加密時,將它解壓縮到內存中是一個好主意。它是否會引入恐慌開銷? – Codebeat

回答

0

發現關於第二個問題的問題,而不是答案:我用:webContent.loadDataWithBaseURL("file:///android_asset/www/", content, mimeType, "utf-8", null);內容顯示沒有問題......然而,第一個問題的立場,而不是;但考慮到一年多沒有答案,我會考慮加密數據是好的。

0

只要您還可以將解密密鑰保密,數據加密就可以,但上述代碼並非如此。在反編譯apk內嵌的DEX文件後,硬編碼的解密密鑰可以很容易地被發現。

如果你想隱藏的HTML和JavaScript文件中的應用程序邏輯,如果該應用程序邏輯並不需要離線功能,那麼你可以外包該應用程序邏輯的代碼在服務器上。

從這裏,你有兩個選擇:

  1. 負載從服務器動態應用程序代碼時 你需要它(和客戶端上運行的應用程序代碼)。
  2. 實現在服務器端,如應用程序邏輯,作爲 Web服務(和服務器上運行的應用程序代碼,客戶端 只知道如何調用Web服務)

簡短的回答對於你的第一個問題是沒有方法或技術來完美保護你的應用程序。我建議您看看How to avoid reverse engineering of an APK file?以瞭解可能的保護方法。