8

我应该将我的应用程序的实际公钥粘贴到这个变量的值中吗?

或者我应该对其进行编码,然后无论编码的字符串是什么,我都会将该字符串变成这个变量的值?

应该是哪个?

4

4 回答 4

4

您的 Android 开发者控制台中的公钥(可以在“编辑配置文件”下找到)已经是 Base64 编码的。只需将密钥的内容复制粘贴到源文件中即可。例如,如果你有这样的事情:

在此处输入图像描述

然后在你的Security.java

String base64EncodedPublicKey = "MIIBIjANBgkqhkiG9w0BAQ......";
于 2012-07-14T03:25:00.517 回答
2

正如 Google 应用内计费示例代码所说,您应该混淆这个公钥。

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

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

对于我的利基市场来说,这是一种“足够好”的方法。有关混淆的更多信息,请参阅此 stackexchange 安全问题

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;
}
于 2014-06-27T09:31:03.730 回答
1

您需要程序源代码中的公钥,以便您可以检查签名。是的,破解者会发现它,将其替换为假货,并为您的程序提供虚假购买,这是非零且不可避免的风险。

您无法完全隐藏密钥以防窥探,但可以混淆。您可以将 Base64 字符串分解为不同位置的多个字符串常量,并在使用前将它们连接起来。最好给这些块起不起眼的名字(喜欢MY_PUBLIC_KEY_PART_4)。您还可以对其应用额外的软加密层 - 例如 XOR a value。您可以添加完整性检查 - 确保密钥没有被欺骗(例如,将密钥的哈希存储在其他地方并检查)。但这仍然是通过默默无闻的安全性 - 一个足够坚定的黑客会通过。

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

于 2012-07-14T03:56:20.613 回答
0

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

于 2012-07-17T20:28:05.210 回答