在应用计费安全性

时间:2012-12-29 19:42:45

标签: android security in-app-billing

我已经完成了在app billing v3中使用的应用程序的开发。我的应用程序是一个考试帮助应用程序,其中包含一系列插入数据库的问题。令我担心的是安全性超越预期,其他几乎没有。我的应用程序查询库存中的已购买商品,因此存储购买不是问题。

所以第一个问题是有人可以反编译应用程序(我已经完成了),即使使用proguard,你也可以毫不费力地检索所有问题。

接下来是应用程序的公钥。这可以很容易地从我的应用程序中获取,根据开发人员指南,这是我应该保持安全的。

但是我真的不知道如何实现任何形式的安全性。或者甚至我应该走多远才能获得安全保障。没有服务器,如果我将所有内容保留在设备上,我认识到它不会是完美的(远非它),但我至少会喜欢黑客而不是被逗乐。

基本上问题是:

我应该使用什么类型的安全性以及如何使用它?只是指着我一步一步地浏览它的链接,这样我就能理解它会很棒。

非常感谢!

澄清:

没有涉及服务器。数据存储在应用程序中。当查询库存时(通过queryinventoryasync方法),如果已购买库存,则返回库存,并且每次应用程序启动时都会运行。在应用程序计费本身,我认为是可以的,我要求更多关于我自己的应用程序的应用程序公钥 - 我的意思是以某种方式使复制更难,但目前我已经把它分成15个字符串,我只是“添加”它们在运行时彼此相关,但这几乎没有任何好处,只需将它作为一个字符串。我想以某种方式加密它只是不知道如何。

1 个答案:

答案 0 :(得分:18)

好问题。

公钥必须在设备上可用才能使用。一旦它出现在设备上,它就不再受到真正的保护了。关键本身并不是秘密,但我们需要将其替换为更困难的任务。

您可以做的是使用所谓的XOR加密。以下是XOR加密器和解密器方法的示例。

public static String xorEncrypt(String input, String key) {
    byte[] inputBytes = input.getBytes();
    int inputSize = inputBytes.length;

    byte[] keyBytes = key.getBytes();
    int keySize = keyBytes.length - 1;

    byte[] outBytes = new byte[inputSize];
    for (int i=0; i<inputSize; i++) {
        outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
    }

    return new String(Base64.encode(outBytes, Base64.DEFAULT));
}

public static String xorDecrypt(String input, String key) {
    byte[] inputBytes = Base64.decode(input, Base64.DEFAULT);
    int inputSize = inputBytes.length;

    byte[] keyBytes = key.getBytes();
    int keySize = keyBytes.length - 1;

    byte[] outBytes = new byte[inputSize];
    for (int i=0; i<inputSize; i++) {
        outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
    }

    return new String(outBytes);
}

您需要的是选择密码字符串(String key)并使用它加密您的公钥(String input)。您可以将此加密密钥存储在类中。当您需要真实密钥值时,使用密码和公共(加密)密钥字符串调用xorDecrypt()。密码也是您在代码中存储的字符串。正如我所说,我们并没有真正保护它,但我们更难以找到和/或替换它。

您还可以添加更复杂的逻辑,以了解如何组合加密的公钥和密码。这只会增加更多的复杂性,但不会保证您的密钥不会被解密。无论如何Google confirms XOR加密总比没有好。

Android 4.3增加了一些安全功能,可用于存储公钥。该解决方案需要服务器通信和硬件支持才能真正安全。这些是Key Chain enhancements and Android Keystore Provider