我应该将应用的实际公钥正确粘贴到此变量的值吗?
或者我应该编码它然后编码的字符串是什么,我将该字符串变为该变量的值?
它应该是什么?
答案 0 :(得分:4)
Android Developer Console中的公钥(可在“编辑个人资料”下找到)已经是Base64编码。只需复制粘贴源文件中的密钥内容即可。例如,如果你有这样的东西:
然后在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等。