資産を単独で保護する方法ではなく、変更や再パッケージ化から効果的に保護する方法について説明しますが、最終的に同じ手法を暗号化に適用することもできます。不完全ですが、変更を大幅に困難にすることができます。
証明書を使用してアプリケーションに署名します。彼らはあなたのものを取り除くことができますが、それを元に戻すときに他の誰も同じ証明書を作成することはできません. したがって、実行時にアプリケーションの署名をチェックして、期待どおりであることを確認できます。
これを行うための安価で厄介なコードを次に示します。
PackageManager pm = context.getPackageManager();
PackageInfo info = pm.getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES );
if ( info.signatures[ 0 ].toCharsString().equals( YOUR_SIGNATURE ) )
{
//signature is OK
}
ここで、YOUR_SIGNATURE は定数で、署名済みアプリでこのコードを実行することで取得されます。
さて、あなたがすでにほのめかした2つの問題が残っています:
ソースコードの定数を証明書に合わせて変更し、アプリを再パッケージ化して再署名するだけの人をどのように止めることができますか?
誰かが check メソッドを見つけてそれを削除するのをどのように止めることができますか?
両方への回答: 絶対に不可能ではありませんが、難読化によってかなりうまく機能します。無料の Proguard (より便利な商用の Dexguard) は、これを行うためのツールです。後者の現在の 350 ユーロのコストであきらめることができます。一方で、私はこのように保護されたアプリをリバース エンジニアリングしようとしましたが、リスクが非常に高くない限り、苦労する価値はありません。
ある程度、(1) 自分で難読化を行うこともできます。実行時に署名「定数」を複雑なプログラムによる方法で組み立てて、見つけて置き換えるのを困難にします。
(2) は実際にはソフトウェア設計の問題です。チェックを削除するのが非常に複雑または煩わしいものになります。難読化すると、そもそも見つけにくくなるだけです。
さらなる注意として、 Google Licensingのようなものがこの領域で保護を提供するかどうかを調べたいと思うかもしれません. 経験がないので、自己責任でお願いします。