android webview加密内容

时间:2012-01-23 12:39:43

标签: android webview encryption

我有一个使用webview来显示内容的应用程序,而Javascript调用是我的应用程序的控制器。 为了提供一定程度的安全性,我对代码进行了模糊处理。这还不够,因为我想加密html和js文件,然后在运行时解密它们。我用这些用RC4算法加密的资源打包了apk文件。在加载文件时,我正在解密javascript文件,加载它们然后解密html文件并加载它。但是这不起作用,因为webcontent以以下形式显示消息:数据的网页: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 :(得分:0)

找到第二个问题的答案,而不是:webContent.loadData(content, mimeType, "utf-8");我使用过:webContent.loadDataWithBaseURL("file:///android_asset/www/", content, mimeType, "utf-8", null);内容显示没有问题......但是,第一个问题是否有效,而不是;但考虑到一年多没有答案,我会考虑加密数据是可以的。

答案 1 :(得分:0)

只要您还可以保密解密密钥,数据加密就可以了,但上述代码并非如此。在反编译嵌入在APK内的DEX文件后,可以很容易地发现硬编码的解密密钥。

如果要在HTML和JavaScript文件中隐藏应用程序逻辑,并且该应用程序逻辑不需要脱机功能,那么您可以在服务器上外包该应用程序逻辑的代码。

从这里你有两个选择:

  1. 每当从服务器动态加载应用程序代码 你需要它(并在客户端上运行应用程序代码)。
  2. 在服务器端实现应用程序逻辑,例如,作为a Web服务(并在服务器,客户端上运行应用程序代码 只知道如何调用Web服务)
  3. 您对第一个问题的简短回答是,没有任何方法或技术可以完美保护您的应用程序。我建议您查看How to avoid reverse engineering of an APK file?,了解可能的保护方法概述。