Android计费 - 在文件Security.java中,base64EncodedPublicKey应该是编码值吗?

时间:2012-07-12 01:26:35

标签: android android-billing

我应该将应用的实际公钥正确粘贴到此变量的值吗?

或者我应该编码它然后编码的字符串是什么,我将该字符串变为该变量的值?

它应该是什么?

4 个答案:

答案 0 :(得分:4)

Android Developer Console中的公钥(可在“编辑个人资料”下找到)已经是Base64编码。只需复制粘贴源文件中的密钥内容即可。例如,如果你有这样的东西:

enter image description here

然后在Security.java

String base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQ......";

答案 1 :(得分:2)

正如Google应用内结算的示例代码所示,您应该对此公钥进行模糊处理。

  

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

我使用非常简单的Java代码生成Java类,它将返回公钥。基本思想是使用递归来使用内部静态类重新创建密钥。 这只是思考的食物

这是一个足够好的"我的利基市场的方法。有关混淆的更多信息,请参阅this stackexchange security question

public static void main(String[] args) throws Exception {
    String className = genClassName();
    PrintWriter writer = new PrintWriter("C:\\" + className + ".java", "iso-8859-1");
    printClass(className, writer, "XXXXXX-YOUR-PUBLIC-KEY-GOES-HERE-XXXXXXX", true);
    writer.close();
}

private static String genClassName() {
    return "Class" + UUID.randomUUID().toString().replaceAll("-", "");
}

private static String printClass(String thisClass, PrintWriter writer, String key, boolean root) {
    int split = key.length() / 2;
    if (split < 10) {
        writer.println("public " + (root ? "" : "static") + " class " + thisClass + " {");
        writer.println("public static String get() {");
        writer.println("return \"" + key + "\";");
        writer.println("}");
        writer.println("}");
    } else {
        String first = key.substring(0, split);
        String last = key.substring(split, key.length());
        writer.println("public " + (root ? "" : "static") + " class " + thisClass + " {");
        String class1 = printClass(genClassName(), writer, first, false);
        String class2 = printClass(genClassName(), writer, last, false);
        writer.println("public static String get() {");
        writer.println("return " + class1 + ".get() + " + class2 + ".get();");
        writer.println("}");
        writer.println("}");
    }

    return thisClass;
}

答案 2 :(得分:1)

您需要程序源代码中的公钥,以便检查签名。是的,有一个非零的,不可避免的风险,一个饼干会发现它,用假的替换它,并喂你的程序假购买。

你不能完全隐藏钥匙,不能窥探,但你可以混淆。您可以将Base64字符串拆分为不同位置的几个字符串常量,并在使用前将它们连接起来。最好给这些块不明显的名字( not ,如MY_PUBLIC_KEY_PART_4)。您还可以对其应用额外的软加密层 - 例如XOR值。您可以添加完整性检查 - 确保密钥没有被欺骗(例如,将密钥的哈希存储在别处并检查)。但这仍然是默默无闻的安全 - 一个坚定的黑客将会通过。

还要考虑内置代码混淆工具ProGuard。

答案 3 :(得分:0)

如果您的服务器组件是应用程序的一部分,那么您可以将安全性的大部分元素(包括公钥)移动到服务器。在服务器上,您可以生成随机数并验证购买(我已将其移至RESTFul WCF服务)。如果您的服务器组件是基于.NET的,那么您可能必须从公钥生成模数和指数,以便您可以使用RNGCryptoServiceProvider类。有一个Google I / O视频,其中包含概述to In-App Billing等。