Android In App Billing:保護應用程序公鑰


2 Answers

另一種方法是在密鑰上進行一些基本的轉換。

// 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 );

因此,我們的想法是將原始密鑰放入base64EncodedPublicKey並運行上面的代碼,它將交換大寫字母並將結果放回base64EncodedPublicKey 。 然後,您可以從調試器複製結果並將其作為原始base64EncodedPublicKey值粘貼到代碼中。 此時,您的密鑰將被轉換(大寫和小寫切換),並且在運行時它將把它修復回正確的外殼,並繼續工作。

上面顯然是一個非常基本的轉碼,但你可以更有創意,顛倒AZ的順序,交換奇數和偶數,交換元音偶數。 這裡的問題是,如果我將代碼放在上面的代碼片段中,它會執行一些更有趣的代碼轉換,然後每個人都將其複制並粘貼到他們的項目中,那麼一個破解者將能夠輕鬆地自己查看和使用轉碼(從查看這個帖子)! 所以你必須自己想出一些變換。

我故意在兩個方向上完成上述工作(因此,如果你運行兩次,你將獲得原始值),因為它可以很容易地在原始密鑰上運行算法。 我覺得它有點整潔,看起來真正的鑰匙就像普通文本一樣坐在那裡,一個隨意的餅乾可能會嘗試切換它然後在它不起作用時感到困惑。

Question

來自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獲取應用程序公鑰(已經過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提供。

我們如何使用任何位操作過程以編程方式創建相同的鍵? 有人做過嗎? 有沒有關於如何做到這一點的示例代碼?




有人真的需要你的私鑰嗎? 我認為整個想法都取而代之 。 恕我直言,任何操縱都是無用的。 邪惡的人唯一要做的就是用正確的(他自己的密鑰)值初始化變量,一行是谷歌API調用。




我所做的是將密鑰轉換為char數組,將其拆分為兩個,然後在需要時重建它,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shop);

    char[] base64KeyByteArray = ArrayUtils.addAll(getPublicKeyChunk1(), getPublicKeyChunk2());

    Log.d(TAG, String.valueOf(base64KeyByteArray));
}

private char[] getPublicKeyChunk1() {
    return new char[]{82, 73, 67, 66, 73, 106, 65, 78, 66, 103, 107, 113, 104, 107,
            105, 71, 57, 119, 79, 66, 65, 81, 69, 70, 65, 65, 79, 67, 65, 81, 56, 65, 77, 73,
            73, 66, 67, 103, 75, 67, 65, 81, 69, 65, 121, 55, 81, 76, 122, 67, 105, 80, 65,
            110, 105, 101, 72, 66, 53, 57};
}

private char[] getPublicKeyChunk2() {
    return new char[]{82, 43, 68, 47, 79, 121, 122, 110, 85, 67, 118, 89, 108, 120, 43, 49,
            80, 100, 67, 108, 55, 90, 57, 103, 119, 57, 87, 78, 79, 111, 53, 101, 80, 71,
            117, 74, 104, 82, 87, 97, 100};
}



Related