Android应用内安全建议 - 这是什么意思?

时间:2013-06-20 04:01:05

标签: android security public-key-encryption

Android开发人员说如下关于在您的项目中存储您的应用公钥:

  

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

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

他们在这个例子的评论中说了同样的话,但他们实际上并没有通过他们的指示来证明他们的意思。这就是它所说的:

  

而不是仅仅存储嵌入的整个文字字符串   该            *程序,在运行时从件或构造密钥            *使用位操作(例如,XOR与其他字符串)来隐藏            *实际的钥匙。密钥本身不是秘密信息,但我们不是            *希望攻击者能够轻松地将公钥替换为公钥            *他们自己的,然后来自服务器的假消息。

那么一个人究竟该怎么做呢?

3 个答案:

答案 0 :(得分:2)

Android开发人员想要说“你需要与谷歌播放同步”的“公钥”用于你想要使用你的应用程序进行的任何付款,它不应该直接在你的应用程序源代码中使用,因为它很容易被攻击任何人。 因此,一种方法是将您的公钥存储在服务器端,一旦您从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);
       }

答案 1 :(得分: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那样入侵内存。内存黑客只是一个例子,攻击者可能会做各种各样的事情。你无法阻止他们,但是,你可以让他们的生活更加艰难。

答案 2 :(得分:1)

As already notedsecurity through obscurity不起作用,因此您可以忽略该文档。