2012-01-23 47 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?以了解可能的保护方法。