質問
proguard を使用して Android コードを難読化し、逆コンパイルしました。覗き見から本当に隠したい文字列がたくさんあります。コードを逆コンパイルすると、文字列は誰でも確認できるようになり、変更できるようになりました。文字列の 1 つは私のライセンス サーバーへの URL であり、事実上、URL が偽のサーバーを指すように変更される可能性があります (サーバー コードを一般に公開する予定なので)。この種の情報を隠す最善の方法は何ですか?
また、R クラスの文字列はすべて乱数であることに気付きましたが、逆コンパイルされたコードでは R クラスが見つかりません。どこですか?
敵の例 なるほど: new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);
2130903058 はレイアウト ファイルですが、何を参照しているのでしょうか?この番号は、何らかのアドレスを指している場合を除き、何の意味も持ちません。
解決
安全ではなく不明瞭に満足していると仮定すると、使用できる多くのメカニズムがありますが、ProguardのようなObfuscatersはあなたを助けることができません。
これを達成するには、自分で文字列のエンコードまたは暗号化を行う必要があります。使用するアプローチは、明白な検査から隠そうとしている場合、エンコードで十分かもしれません(Androidを参照してください」というアプローチに依存します(Androidを参照してください.util.base64、 http://developer.android.com/reference/android/util/base64.html)。エンコードは決して安全ではなく、サイトへの明白な参照を削除するだけであることに注意してください。
あなたがもっと何かを守ろうとしているなら、あなたは実際に文字列を暗号化するために移動することができます、これを行うために、あなたはjavax.crypto.cipherを介してAESのような対称的な暗号を使用します、 http://www.androidsnippets.org/snippets/39/index.html 適切な使用例を提供します。繰り返しになりますが、これはハッカーになるよりも安全です。瓶のどこかにキーを保存する必要があるため、暗号化のセキュリティを無効にする必要があります。
これを明確にするために、基本的な手順は次のとおりです。
- 既知のキーを使用して文字列を暗号化する手動で作成します。
- コードをこの文字列の復号化バージョンを使用するように変換します。例:
前:
public class Foo {
private String mySecret = "http://example.com";
...
}
なる:
public class Foo {
private String encrypted = "<manually created encrypted string>";
private String key = "<key used for encryption";
private String mySecret = MyDecryptUtil.decrypt(encrypted, key);
...
}
これらすべてに代わる(良い)代替案は、Googleが提供するライセンスサーバーなどのサードパーティのDRMソリューションを使用することを検討しています http://android-developers.blogspot.com/2010/07/licensing-service-for-android.html. 。これはあなたがあなた自身を転がすものよりも安全かもしれませんが、私が上記のものと非常によく似た制限の対象となります。
他のヒント
こんにちは、みんな。
させて
secret
隠したいテキストになりますデバッグ/リリースのキーハッシュを見つけてください。KeyStore。させて
k1
この鍵になりましょう。
(Tools keytool+openSSLを使用してください: keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
)
ツール(Androidコードの外部)を使用して暗号化する
secret
とk1
encrypted = encode (secret, k1)
(例えば: https://jwt.io, 、Javaの場合: https://github.com/jwtk/jjwt).
- Android Javaコードで書き留めます
encrypted
. 。デコードされたバージョンが必要な場合encrypted
(これは、オリジナルですsecret
) 書きます
original = decode(encrypted, get_my_keyhash_programmatically() )
それで全部です。 これはオリジナルのために機能します secret
Javaソースコードには表示されていませんが、 k1
それをデコードします。そして、ハッカーがデコードされた秘密を印刷したい場合、彼はコードを変更して再コンパイルし、自分のキーストアではなく自分のキーストアに署名する必要があります。secret
. 。 (「唯一の」ポイントはかどうかです k1
オリジナルの.apkから把握できます)。
注:get_my_keyhash_programtally():
try {
PackageInfo info = getPackageManager().getPackageInfo(
"el nombre de su paquete por ejemplo com.tarea.u8",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
私がやったのは、グローバル ユーティリティ クラスに静的文字列の長いリストを作成することでした。文字列の長いリストのどこかに、パスキーを複数のチャンクに分けて配置しました。
私のコードでは、実際のパスキーが何であるかを簡単に確認できますが、難読化ツールが機能すると、すべての静的キーには A、B、C などの名前が付けられます。そしてそれを見つけるのはもう簡単ではなくなります。
ROT47を使用しました。それはあまり安全ではありませんが、使いやすく実装しやすいです。なぜなら、それは対称エンコーダー/デコーダーであるため
「ちょうど別のPerl Hacker」をGoogleで検索する必要があります。これらは、難読化されたコードを使用して文字列を印刷するプログラムです。また、他の言語には多くの例があり、ネット上にperlがあります。
使用できます デクスガード 文字列を暗号化するために、おそらく手動で達成できるよりも効果的に、そしてソースコードに負担をかけることなく。