La facturation Android – dans le fichier Security.java la base64EncodedPublicKey est-elle la valeur codée?

Devrais-je coller directement la clé publique de mon application dans la valeur de cette variable?

Ou devrais-je l'encoder et quelle que soit la chaîne codée, je ferais de cette chaîne la valeur de cette variable?

Quelle devrait être?

  • La facturation dans l'application Android: ne peut pas démarrer une opération asynchrone car une autre opération asynchrone (en cours)
  • Android IABv3 getSkuDetails ne renvoie pas les détails de Sku
  • Identifier les téléchargements de Play Store remboursés
  • Pourquoi est-il important de définir la charge utile du développeur avec la facturation dans l'application?
  • Google dans la liste des produits d'achat d'applications
  • Exception de facturation Android
  • Erreur de bibliothèque de facturation Android
  • IabHelper Android bug (NullPointerException) lancePurchaseFlow?
  • 4 Solutions collect form web for “La facturation Android – dans le fichier Security.java la base64EncodedPublicKey est-elle la valeur codée?”

    La clé publique présente dans votre console de développement Android (qui se trouve sous «Modifier le profil») est déjà codée en Base64 . Il suffit de copier coller le contenu de la clé dans votre fichier source. Par exemple, si vous avez quelque chose comme ceci:

    Entrez la description de l'image ici

    Ensuite, dans votre Security.java :

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

    Comme l'indique le code d'exemple Google pour la facturation dans l'application, vous devez obscurcir cette clé publique.

    Au lieu de simplement stocker toute la chaîne littérale intégrée dans le programme, construisez la clé à l'exécution à partir de pièces ou utilisez la manipulation de bits (par exemple, XOR avec une autre chaîne) pour cacher la clé réelle. La clé elle-même n'est pas une information secrète, mais nous ne voulons pas qu'il soit plus facile pour un attaquant de remplacer la clé publique par l'un de ses messages personnels et faux depuis le serveur.

    J'utilise un code Java très simple pour générer la classe Java qui me ramènera la clé publique. L'idée de base est d'utiliser la récursion pour recréer la clé en utilisant la classe interne statique. C'est juste une réflexion .

    C'est une approche «assez bonne» pour mon marché de niche. Consultez cette question de sécurité stackexchange pour plus d'informations sur l'obfuscation.

     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; } 

    Vous avez besoin de la clé publique dans le code source du programme afin que vous puissiez vérifier la signature. Oui, il existe un risque non négligeable, incontournable, qu'un cracker le trouve, le remplacer par un faux et nourrir ses faux achats.

    Vous ne pouvez pas cacher complètement la clé des regards indiscrets, mais vous pouvez obscurcir. Vous pouvez diviser la chaîne Base64 en plusieurs constantes de chaîne dans différents points et les concaténer avant leur utilisation. Mieux donner aux morceaux des noms discrets ( pas comme MY_PUBLIC_KEY_PART_4 ). Vous pouvez également appliquer une couche supplémentaire de chiffrement doux – quelque chose comme XOR une valeur. Vous pouvez ajouter une vérification d'intégrité – assurez-vous que la clé n'a pas été falsifiée (disons, rangez le hash d'une clé ailleurs et vérifiez). Mais tout ceci est encore une sécurité par obscurité – un hackeur assez déterminé va réussir.

    Considérez également ProGuard, l'outil d'obstruction du code intégré.

    Si vous avez un composant serveur dans le cadre de votre application, vous pouvez déplacer la plupart des éléments de votre sécurité, y compris votre clé publique, sur votre serveur. Sur le serveur, vous pouvez générer le nonce et vérifier l'achat (j'ai déplacé le mien vers un service RESTFul WCF). Si votre composant serveur est basé sur .NET, vous devrez probablement générer un module et un exposant de votre clé publique afin que vous puissiez utiliser la classe RNGCryptoServiceProvider . Il y a une vidéo Google E / S qui donne une vue d' ensemble du facturation en application, entre autres.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.