web-dev-qa-db-ja.com

apkをセキュアにする方法。逆コンパイルからの保護

こんにちは、企業向けのアプリケーションを開発しています。このアプリケーションには、個人情報を含むsqliteのデータベースが含まれており、それを保護したいと考えています。どうすればそれを保護できますか。私は自分でやったので、apkは簡単に完全に逆コンパイルできるからです。だから今の質問は、APKを保護する方法ですか?また、電話にアプリをインストールした後、電話にある私のデータベースを保護する方法。

45
Hamdullah shah

基本的に、APKのクラッキング/反転/再パッケージ化を保護するための5つの方法があります。

1. Isolate Java Program

最も簡単な方法は、ユーザーにJava Classプログラムにアクセスできないようにすることです。これが最も基本的な方法であり、これを実現するためのさまざまな特定の方法があります。キーJavaサーバー上のクラス。クライアントは、クラスファイルに直接アクセスするのではなく、サーバーの関連するインターフェイスにアクセスしてサービスを取得します。したがって、ハッカーがクラスファイルを逆コンパイルする方法はありません。現在、 HTTP、Webサービス、RPCなどのインターフェイスを介して提供される標準およびプロトコルサービスはますます増えています。しかし、この保護に適さないアプリケーションはたくさんあります。たとえば、Javaスタンドアロンプ​​ログラムのプログラムは分離できません。

2.クラスファイルの暗号化

クラスファイルが直接逆コンパイルされないように、多くの開発者は、登録番号、シリアル番号管理、その他の関連クラスなどの主要なクラスファイルを暗号化します。これらの暗号化されたクラスを使用する前に、プログラムはまずこれらのクラスを復号化してから、これらのクラスをJVMにロードする必要があります。これらのクラスは、ハードウェアまたはソフトウェアによって復号化できます。

開発者は、多くの場合、カスタムクラスローダークラスを介して暗号化クラスをロードします(セキュリティのため、アプレットはカスタムクラスローダーをサポートしません)。カスタマイズされたClassLoaderは、暗号化クラスを最初に検出し、次に復号化します。最後に、復号化されたクラスをJVMにロードします。 Customed ClassLoaderは、このプロテクトメソッドで非常に重要なクラスです。暗号化されていないため、ハッカーの最初の標的になる可能性があります。関連する復号化キーとアルゴリズムが克服されていれば、暗号化されたクラスを簡単に復号化できます。

3.ネイティブコードへの変換

プログラムをネイティブコードに変換することも、逆コンパイルを防ぐ効果的な方法です。ネイティブコードは逆コンパイルが難しいことが多いためです。開発者は、アプリケーション全体をネイティブコードに変換することも、主要なモジュールのみを変換することもできます。モジュールの重要な部分を変換するだけの場合、Javaプログラムがこれらのモジュールを使用しているときに呼び出すJNIテクノロジーが必要です。この手段を使用して保護するJavaのクロスプラットフォーム機能を放棄Javaプログラム。異なるプラットフォームでは、異なるバージョンのネイティブコードを維持する必要があります。これにより、ソフトウェアのサポートとメンテナンスの作業負荷が増加します。しかし、一部の主要モジュールでは、このソリューションが必要になることがあります。これらを保証するために開発者はこれらのコードをデジタル署名する必要があります。これらのネイティブコードを使用する前に、開発者はこれらのローカルコードを認証して、ハッカーによってこれらのコードが変更されていないことを確認する必要があります。その後、開発者は関連するJNIメソッドを呼び出すことができます。

4.コードの難読化

コードの難読化は、クラスファイルを再編成して処理し、処理されたコードが未処理のコードと同じ機能(セマンティクス)を達成するようにすることです。しかし、難読化されたコードは逆コンパイルが困難です。つまり、逆コンパイルされたコードは非常に理解しにくいため、逆コンパイルスタッフは実際のセマンティクスを理解するのが困難です。理論的には、ハッカーに十分な時間があれば、難読化されたコードはまだクラックされる可能性があります。一部の人々でさえ、難読化解除ツールを開発しています。しかし、実際の状況からは、難読化の多様化した開発、難読化理論の成熟により、難読化されたJavaコードは逆コンパイルを防ぐことができます。

5.オンライン暗号化

APK Protect はAPKのオンライン暗号化Webサイトでしたが、2013年以降に活動が中止されたようです。 JavaコードおよびC++コード保護を提供して、アンチデバッグおよび逆コンパイル効果を実現しました。

元々、この最後の方法を使用することをお勧めしました。私の経験に基づいて、操作は非常に簡単で、時間がかかりません。

32
classc_abc

Jellybeanを使用すると、これが可能になりました。

$ openssl enc -aes-128-cbc -K 000102030405060708090A0B0C0D0E0F 
-iv 000102030405060708090A0B0C0D0E0F -in my-app.apk -out my-app-enc.apk

$ adb install --algo 'AES/CBC/PKCS5Padding' --key 000102030405060708090A0B0C0D0E0F 
--iv 000102030405060708090A0B0C0D0E0F my-app-enc.apk
        pkg: /data/local/tmp/my-app-enc.apk
Success

詳細については、次のブログ投稿をご覧ください details

8
Ben Crowhurst

これがユーザーの手に渡ってはならない秘密情報である場合、それを保護することはできません。デバイスに情報(コードまたはデータ)を配置し、アプリケーションにアクセスさせることは基本的に不可能ですが、デバイスを持つ人がその情報にアクセスすることは許可しません。

情報を暗号化することは、セキュリティの観点からは意味がありません。アプリケーションを使用するには、情報を解読するために必要なものをすべて含める必要があります。

できることは、その情報にアクセスするのが面倒で時間がかかるようにすることだけです。これは、情報を秘密にする必要性があまりない場合にのみ役立ちます。これは、proguardを使用して.apkファイルを難読化できることです。

5
Ben

Sqlite暗号化を検討しましたか?このスレッドを参照してください- Android用のsqlite暗号化

.apkを保護するには、proguardを使用してコードを難読化してみてください。 http://developer.Android.com/guide/developing/tools/proguard.html を参照してください

4
Vino

「Anti Decompiler(Android)Trial」を試すことができます

https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial

Proguardでできないことができます。

  • すべてのconst値(文字列、文字)を非表示にすると、apkファイルに「my key」、「my val」などのクリアテキストが表示されなくなります。
  • AndroidManifest.xmlで参照される難読化ファイル名
  • ソースコードに偽のコードを追加します。強力な逆コンパイラが好むイベント:dex2jar、jd-gui、... apkファイルを正確に元に戻すことはできません。ほとんどの機能はコメント「エラー」で表示されます。

=====

  • 変換後、誰かにソースプロジェクトを渡した場合、読むことも理解することもほぼ不可能になります。
  • このソリューションはProguardを除外するものではありません。それらを組み合わせて使用​​できます。 (機能、Proguardのフィールド難読化は、このソリューションの難読化機能よりも優れています)
3
Son tung

私の投稿は http://www.androidpit.com/en/Android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect で読むことができます。 APK Protect のプロテクトシェルで追加されたAPKは逆コンパイルできないようです。つまり、暗号化方法は非常に高度です。熟練したハッカーでさえ、それを解読するには長い時間が必要です。

3
Jack Shaw

機密データを含むデータベースの場合、いくつかの列の値または他の回答に記載されているような完全なデータベースを暗号化し、パスワードがデバイスに保存されていないが、アクセス時にユーザーが入力する必要があることを確認できますデータ。

保護する必要があるコードの断片がある場合、それを保護する良い方法は本当にありません。限られた量のユースケースでできることは、オンラインサービスへの依存関係を作成し、サーバーを保護することだけです。しかし、多くのアプリケーションでは、これはオプションではありません。

0
Beanow