61

Android In App Billing バージョン 3 (TrivialDrive) SDK 付属のサンプル アプリケーションから

MainActivity.java

/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
 * (that you got from the Google Play developer console). This is not your
 * developer public key, it's the *app-specific* public key.
 *
 * Instead of just storing the entire literal string here embedded in the
 * program,  construct the key at runtime from pieces or
 * use bit manipulation (for example, XOR with some other string) to hide
 * the actual key.  The key itself is not secret information, but we don't
 * want to make it easy for an attacker to replace the public key with one
 * of their own and then fake messages from the server.
 */
String base64EncodedPublicKey = "CONSTRUCT_YOUR_KEY_AND_PLACE_IT_HERE";

このセキュリティ対策を理解しているかどうかはわかりません。Google Play Developer Console からアプリケーションの公開鍵 (すでに Base 64 でエンコードされている) を取得する方法を知っています。

私が理解していないのはこの部分です

 /* Instead of just storing the entire literal string here embedded in the
 * program,  construct the key at runtime from pieces or
 * use bit manipulation (for example, XOR with some other string) to hide
 * the actual key
 */

私の知る限り、この公開鍵は定数文字列であり、アプリケーションのアップロード プロセス中に Google から提供されます。

ビット操作プロセスを使用して、プログラムで同じキーを作成するにはどうすればよいでしょうか? 誰かが以前にやったことがありますか?これを行う方法に関するサンプルコードはありますか?

4

7 に答える 7

43

このようなもの:

String Base64EncodedPublicKey key = "Ak3jfkd" + GetMiddleBit() + "D349824";

また

String Base64EncodedPublicKey key = 
         DecrementEachletter("Bl4kgle") + GetMiddleBit() + ReverseString("D349824");

または、キーをbase64プレーンテキストに単一の文字列に入れないもの。おそらく、未加工のbase64テキストフラグメントは非常に簡単に見つけられるため、キーをbase64に保存しないものも良い考えです.

キーを保護するのに特に良い方法ではありません。しかし、誰かが APK 内のリテラル文字列を検索して、base64 でエンコードされた公開鍵のようなものを探しているという些細な攻撃から保護します。少なくとも、#$ # $ers を少しだけ機能させます。

おそらく、悪人があなたの公開鍵を特定すると、悪いことをする可能性があります。どうやらGoogleはそう考えているようだ。このステップが何をするかは推測できますが、公開フォーラムでそれについて推測し、誰かにアイデアを提供したいのかどうかはわかりません. あなたはそれをしたいのですが。

基本的なプロットの要約は、誰かがプログラムでアプリケーションの LVL を解除するア​​プリケーションを作成することをより困難にしているということです。

これを行っている人は、20,000 個または 30,000 個の Android アプリをクラックして再公開することで生計を立てていると想定されています。おそらく、プログラムによって既に壊れている 20,000 の Android アプリのリストにあなたのアプリを追加するのに 10 分もかからないでしょう。最上位のアプリケーションがない限り。そして、戦いは潜在的に終わりがなく、おそらく最終的には無駄です.

(別の回答で提案されているように)キーを連続したチャンクに分割することは、おそらく十分ではありません。APK の文字列定数テーブルでは、キーが連続した文字列になるためです。プログラムでそれを見つけるのは簡単すぎます。

于 2013-01-16T07:56:49.340 に答える
13

別の方法は、キーに対していくつかの基本的な変換を行うことです。

// Replace this with your encoded key.
String base64EncodedPublicKey = "";

// Get byte sequence to play with.
byte[] bytes = base64EncodedPublicKey.getBytes();

// Swap upper and lower case letters.
for (int i = 0; i < bytes.length; i++) {
    if(bytes[i] >= 'A' && bytes[i] <= 'Z')
        bytes[i] = (byte)( 'a' + (bytes[i] - 'A'));
    else if(bytes[i] >= 'a' && bytes[i] <= 'z')
        bytes[i] = (byte)( 'A' + (bytes[i] - 'a'));
}

// Assign back to string.
base64EncodedPublicKey = new String( bytes );

したがって、元のキーを as に入れてbase64EncodedPublicKey上記のコードを実行すると、小文字と大文字が入れ替えられ、結果が に戻されbase64EncodedPublicKeyます。その後、デバッガーから結果をコピーして、元の値としてコードに貼り付けることができbase64EncodedPublicKeyます。この時点で、キーは変換され (大文字と小文字が入れ替わります)、実行時に正しい大文字と小文字に修正され、引き続き機能します。

上記は明らかに非常に基本的なトランスコードですが、より創造的で、AZ の順序を逆にしたり、奇数と偶数を交換したり、母音を偶数に交換したりできます。ここでの問題は、上記のスニペットにもっと興味深いトランスコードを行うコードを入れて、誰もがそれをコピーして自分のプロジェクトに貼り付けた場合、クラッカーはトランスコード自体を簡単に見つけて使用できることです (この郵便受け)!したがって、自分でいくつかの変換を考え出す必要があります。

元のキーでアルゴリズムを簡単に実行できるようにするため、意図的に上記の作業を双方向に行いました (2 回実行すると、元の値が返されます)。本当のキーがプレーンテキストとしてそこにあるように見えるのは、ちょっとすっきりしていると思います。カジュアルなクラッカーはこれを切り替えようとし、機能しないときに混乱する可能性があります.

于 2015-02-20T10:41:00.343 に答える
5

このようにバラバラに分解できます

String piece1 = "SDFGJKGB4UIH234WE/FRT23RSDF/3DFUISDFVWE";
String piece2 = "SDFGJKGB4UIHUISDFVWE";
String piece3 = "BDYASGBDNAWGRET24IYE23das4saGBENWKD";
String piece4 = "432423SDF23R/+SDDS";

mHelper = new IabHelper(this, piece1 + piece2 + piece3 + piece4);

あらゆる種類の操作が行われます。

攻撃者から公開鍵を完全に隠すことはできません。文字列を操作して、攻撃者を少し混乱させるだけです。

いくつかの文字列を追加して、必要に応じて削除したり、チャンクに分割したりできます。

于 2013-01-16T07:38:40.613 に答える