11

我已经完成了在应用计费 v3 中使用的应用程序的开发。我的应用程序是一个考试帮助应用程序,其中包含一个插入数据库的问题列表。让我担心的是安全性,因为除了 proguard 之外几乎没有其他东西。我的应用程序查询购买物品的库存,因此存储购买不是问题。

所以第一个问题是有人可以反编译应用程序(我已经完成了),即使使用 proguard,您也可以轻松检索所有问题。

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

但是我真的不知道如何实现任何形式的安全性。甚至我应该在安全方面走多远。如果没有服务器,如果我将所有东西都保留在设备上,我会认识到它不会是完美的(远非如此),但我至少希望黑客被吓倒而不是被逗乐。

所以本质上问题是:

我应该使用哪种类型的安全性以及如何使用它?只需将我指向逐步通过它的链接,这样我就可以理解它会很棒。

非常感谢!

澄清:

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

4

1 回答 1

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()使用密码和公共(加密)密钥字符串进行调用。密码也是您存储在代码中某处的字符串。正如我所说,我们并没有真正保护它,但我们使它更难找到和/或更换。

您也可以添加更复杂的逻辑来说明如何组合加密的公钥和密码。这只会增加更多复杂性,但不会给您任何保证您的密钥不会被解密。无论如何,谷歌确认异或加密总比没有好。

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

于 2013-08-22T14:24:24.803 回答