8

Android 开发人员对将您的应用程序公钥存储在您的项目中说如下:

安全建议:强烈建议您不要硬编码 Google Play 提供的确切公共许可证密钥字符串值。相反,您可以在运行时从子字符串构造整个公共许可证密钥字符串,或者在将其传递给构造函数之前从加密存储中检索它。这种方法使恶意第三方更难修改您的 APK 文件中的公共许可证密钥字符串。

这应该是不言自明的吗?我不明白他们要我做什么。

他们在示例的评论中说了同样的话,但是他们实际上并没有证明他们的指示是什么意思。它是这样说的:

不只是将整个文字字符串存储在 * 程序中,而是在运行时从片段构造密钥或 * 使用位操作(例如,与其他字符串进行异或)来隐藏 * 实际密钥。密钥本身不是秘密信息,但我们不想让攻击者很容易用自己的一个 * 替换公钥,然后从服务器伪造消息。

那么一个人究竟是如何做到这一点的呢?

4

3 回答 3

2

android 开发者想说“公钥”,你需要与 google play 同步你想要使用你的应用程序进行的任何支付,它不应该直接在你的应用程序源代码中使用,因为它很容易被任何人破解。因此,一种方法是将您的公钥存储在服务器端,一旦您从 google play 获得响应以验证密钥,将该响应发送到服务器并在服务器上执行您的操作。

       /**
       * String transformation by XOR-ing all characters by value.
       */
       static String stringTransform(String s, int i) {
       char[] chars = s.toCharArray();
       for(int j = 0; j<chars.length; j++)
        chars[j] = (char)(chars[j] ^ i);
         return String.valueOf(chars);
       }
于 2013-06-20T04:09:19.187 回答
1

这是他们试图说的非常基本的信息。让我们看看这个例子:

一些开发人员可能会将许可证本身存储为字符串:

private static final String LICENSE_1="xxx-yyy-zzz"
private static final String LICENSE_2="xxz-yyz-zzz"
private static final String LICENSE_N="xxz-yyz-zzz"

private ArrayList<String> licenseList=new ArrayList<String>();

licenseList.add(LICENSE_N);

他们可能希望用户输入他们的许可证号,所以他们会这样做:

if(licenseList.contains(ExitText.getText().toString())
    //allow
else
   //disallow

现在我可以反编译这个应用程序并获得所有许可证:D

如果您的代码中没有上述任何内容,那么我可以绕过您的许可的唯一方法是:如果它是在本地完成的,则可能是像 GameCIH 那样侵入内存。内存黑客只是一个例子,攻击者可能会做各种各样的事情。你无法阻止他们,但你可以让他们的生活更加艰难。

于 2013-06-20T04:13:56.007 回答
1

如前所述通过默默无闻的安全性不起作用,因此您可以忽略文档。

于 2014-10-01T08:34:52.977 回答