2012-01-23 15 views
3

コンテンツを表示するためにwebviewを使用するアプリケーションがあります.Javascript呼び出しはアプリケーションのコントローラです。 レベルのセキュリティを提供するために、私はコードを難読化しました。これは、htmlファイルとjsファイルを暗号化して実行時に解読したいので十分ではありません。私はこれらのリソースをRC4アルゴリズムで暗号化したapkファイルをパックしました。ファイルをロードするとき、私はjavascriptファイルを解読し、それらをロードしてから、htmlファイルを解読して読み込みます。しかし、これは、Webコンテンツが、データのWebページ:text/htmlが一時的にダウンしているか、永久に移動した可能性があるなどの形でメッセージを表示するため、動作しません。 何が表示されるかを調べるためにonLoadResourceをオーバーロードしました。コンテンツがロードされ、Javascriptコンテンツがロードされているのがわかりますが、ロードされたコンテンツはHTMLでもエスケープされています。android webview encrypted content

私の質問は次のとおりです。 1.アクセスできないようにするには、htmlファイルとjavascriptファイル(assetsフォルダにあります)を保護する方法はありますか? 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、Googleクローズコンパイラでコンパイルされたjsファイル、イメージ(base64)などを1つのファイルに結合する 'コンパイラ'もビルドしました。これはかなりうまくいく。ファイルのサイズは、例えば1.2MBです。サイズは問題ないようですが、それは速く読み込まれます。しかし、私があなたのように暗号化を使用したとき、それをメモリに解凍することをお勧めします。パニックオーバーヘッドを導入していますか? – Codebeat

答えて

0

は、2番目の質問の質問の代わりのための答えを見つけwebContent.loadDataWithBaseURL("file:///android_asset/www/", content, mimeType, "utf-8", null);コンテンツは問題なく表示され...しかし、最初の質問の種類は立場ではなく、 1年以上も答えがなかったことを考えれば、データの暗号化は問題ないと思います。

0

上記のコードでは当てはまらない復号鍵を秘密にしておけば、データの暗号化は正常です。ハードコーディングされた復号鍵は、APK内に埋め込まれたDEXファイルを逆コンパイルした後で容易に検出することができる。

HTMLおよびJavaScriptファイル内でアプリケーションロジックを非表示にし、そのアプリケーションロジックがオフライン機能を必要としない場合、そのアプリケーションロジックのコードをサーバーに委託することができます。ここから

次の2つの選択肢があります:あなたがそれを必要とする(とクライアント上のアプリケーションのコードを実行する)たび サーバから動的にアプリケーション・コードをロードし

  1. を。
  2. Webサービスとして、例えば、サーバ側のアプリケーションロジックを実装(およびサーバー上のアプリケーション・コードを実行し、クライアント は、Webサービスを呼び出すためにのみ方法を知っている)

短い答え最初の質問には、アプリケーションを完全に保護する方法論や技術がないということです。可能な保護方法の概要については、How to avoid reverse engineering of an APK file?をご覧ください。