61 votes

Android App de Facturation: assurer l'application de la clé publique

À partir d'Android En Application de Facturation de la version 3 (TrivialDrive)exemple d'application à venir avec le sdk

MainActivity.java

/* base64EncodedPublicKey should be YOUR APPLICATION'S PUBLIC KEY
 * (that you got from the Google Play developer console). This is not your
 * developer public key, it's the *app-specific* public key.
 *
 * Instead of just storing the entire literal string here embedded in the
 * program,  construct the key at runtime from pieces or
 * use bit manipulation (for example, XOR with some other string) to hide
 * the actual key.  The key itself is not secret information, but we don't
 * want to make it easy for an attacker to replace the public key with one
 * of their own and then fake messages from the server.
 */
String base64EncodedPublicKey = "CONSTRUCT_YOUR_KEY_AND_PLACE_IT_HERE";

Eh bien, je ne suis pas sûr de comprendre cette mesure de sécurité. Je sais comment obtenir l'application de la clé publique (qui est déjà codé en base 64) à partir de Google Play Developer Console.

Ce que je ne suis pas la compréhension de cette partie

 /* Instead of just storing the entire literal string here embedded in the
 * program,  construct the key at runtime from pieces or
 * use bit manipulation (for example, XOR with some other string) to hide
 * the actual key
 */

Autant que je sache, cette clé publique est une constante chaîne de caractères, qui est donné à partir de Google lors de l'application du processus de téléchargement.

Comment pouvons-nous créer la même clé par programmation à l'aide de n'importe quel processus de manipulation? Quelqu'un a fait avant? Est-il un exemple de code sur la façon de faire cela?

43voto

Robin Davies Points 2088

Quelque chose comme ceci:

String Base64EncodedPublicKey key = "Ak3jfkd" + GetMiddleBit() + "D349824";

ou

String Base64EncodedPublicKey key = 
         DecrementEachletter("Bl4kgle") + GetMiddleBit() + ReverseString("D349824");

ou tout ce qui n'est pas de mettre la clé en base64 en clair dans une chaîne unique. Probablement aussi que quelque chose ne va pas stocker la clé en base64 serait une bonne idée aussi, depuis raw base64 fragments de texte sont assez faciles à repérer.

Ce n'est pas un moyen particulièrement utile pour protéger la clé. Mais il protège contre une banale attaque où quelqu'un juste à la recherche par le biais des chaînes de caractères littérales dans APK vous cherchez quelque chose qui ressemble à un base64 clé publique. Au moins vous faites le #$#$ers de travailler un peu.

Sans doute mal les gens peuvent faire de mauvaises choses si ils permettent d'identifier votre clé publique. Google semble le penser, apparemment. Je devine ce que cette étape n', mais je ne suis pas sûr que j'ai vraiment envie de spéculer sur le fait que dans un forum ouvert, et donner des idées. Vous voulez le faire bien.

Le résumé de l'intrigue de base est que vous êtes le rendre plus difficile pour quelqu'un d'écrire une application de programme de LVLs une application.

On suppose que toute personne qui fait cela fait une vie de craquage de 20 ou 30 000 applications android et de la réédition eux. Les Chances sont, je suppose qu'ils ne vont pas prendre le supplément de dix minutes pour ajouter votre application à la liste de 20 000 applications Android qui ont déjà été brisé par un programme, s'ils doivent faire un peu de travail manuel. Sauf si vous avez un haut de niveau de l'application. Et alors que la bataille est potentiellement infinie, et probablement en fin de compte inutile.

Le fractionnement de la clé dans consécutives morceaux (comme proposé dans une autre réponse) n'est probablement pas assez bon. Parce que la clé sera à la fin de chaînes consécutives dans la chaîne de caractères constante des tables dans le APK. Trop facile de trouver un programme.

5voto

Ramyle Points 1692

Vous pouvez le diviser en morceaux comme ça

String piece1 = "SDFGJKGB4UIH234WE/FRT23RSDF/3DFUISDFVWE";
String piece2 = "SDFGJKGB4UIHUISDFVWE";
String piece3 = "BDYASGBDNAWGRET24IYE23das4saGBENWKD";
String piece4 = "432423SDF23R/+SDDS";

mHelper = new IabHelper(this, piece1 + piece2 + piece3 + piece4);

Toute sorte de manipulations va faire.

Vous ne pouvez pas cacher la clé publique parfaitement de l'attaquant, il vous suffit de manipuler la chaîne de confondre un attaquant un peu

Vous pouvez ajouter un peu de chaînes et de le supprimer en cas de besoin ou de le diviser en morceaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X