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?

  • Puis-je créer un élément ListView non sélectionnable?
  • Android: barre d'état pas le thème sur transitiong vers une nouvelle activité
  • Comment fournir des vibrations personnalisées sur des appels entrants spécifiques
  • Activez l'accélération matérielle si disponible (tel que Android 3+) avec Android APK 2.2
  • Animer l'icône du tiroir dans la flèche sur setDisplayHomeAsUpEnabled?
  • Comment attribuer des identifiants uniques à des vues créées dynamiquement?
  • Quelle devrait être?

  • Ecrire un fichier dans un stockage externe dans Android
  • Activation de ExternalNativeBuild avec ABI split
  • L'autorisation READ_GSERVICES est-elle encore nécessaire pour Google Maps?
  • Comment faire une ligne horizontale dans Android par programme
  • Quel en-tête devrait être utilisé pour l'envoi de JSON comprimé GZIP depuis un client Android vers un serveur?
  • 'Attribut de description de contenu manquant sur image' en XML
  • 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.