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

我应该将我的应用程序的实际公共密钥粘贴到这个variables的值吗?

或者我应该编码它,然后无论编码的string,我会把这个string变成这个variables的值?

应该是哪一个?

Solutions Collecting From Web of "Android计费 – 在文件Security.java中,base64EncodedPublicKey应该是编码值吗?"

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

在这里输入图像说明

然后在你的Security.java

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

正如Google应用内结算示例代码所说,您应该混淆此公钥。

而不是只是将整个string存储在程序中,而是在运行时从关键字构造键或者使用位操作(例如,与其他string的XOR)来隐藏实际的键。 密钥本身并不是秘密信息,但我们不想让攻击者轻易地用自己的公钥replace公钥,然后从服务器伪造消息。

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

对于我的利基市场来说,这是一个“足够好的”方法。 有关混淆的更多信息,请参阅此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; } 

您需要程序源代码中的公钥,以便您可以检查签名。 是的,有一个非零的,不可避免的风险,一个黑客会发现它,取而代之的是一个假的,并喂养你的程序假购买。

你不能完全隐藏钥匙,但你可以混淆。 您可以将Base64string拆分成不同位置的几个string常量,并在使用前将它们连接起来。 最好给大块不起眼的名字(不像MY_PUBLIC_KEY_PART_4 )。 您也可以对其应用一个额外的软encryption层 – 例如异或值。 您可以添加一个完整性检查 – 确保密钥没有被欺骗(比如,存储其他密钥的哈希值并检查)。 但是,这一切都是通过默默无闻的安全 – 一个足够坚定的黑客将通过。

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

如果您有一个服务器组件作为您的应用程序的一部分,那么您可以将安全性的大部分元素(包括您的公钥)移至您的服务器。 在服务器上,你可以生成nonce并validation购买(我把我的移动到一个RESTFul WCF服务)。 如果您的服务器组件是基于.NET的,那么您可能必须从您的公钥生成模数和指数,以便您可以使用RNGCryptoServiceProvider类。 有一个谷歌I / Ovideo,其中概述了应用内结算 。