Je viens de dissimuler mon code Android à l'aide de proguard, puis de le décompiler. Il y a un certain nombre de chaînes que j'aimerais vraiment cacher aux regards indiscrets. Quand j'ai décompilé mon code, les chaînes étaient là pour que tout le monde puisse les voir ... et les changer. Une des chaînes est une URL vers mon serveur de licences et ils pourraient en fait changer l’URL pour pointer vers un faux serveur (car je communiquerai le code du serveur au public). Quel est le meilleur moyen de cacher ce type d’information?
De plus, j'ai remarqué que les chaînes de la classe R sont toutes des nombres aléatoires, mais je ne trouve pas la classe R dans le code décompilé. Où est-ce?
Exemple d'ennemi je vois: new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);
2130903058 est un fichier de mise en page mais à quoi se rapporte-t-il? Le chiffre ne signifie rien à moins qu'il ne pointe vers une sorte d'adresse.
En supposant que vous soyez satisfait d’obscur au lieu d’être sécurisé, il existe un certain nombre de mécanismes que vous pouvez utiliser, mais les obfusateurs tels que proguard ne pourront pas vous aider.
Pour ce faire, vous devrez encoder ou chiffrer la chaîne vous-même. L’approche que vous allez utiliser dépend de ce sur quoi vous essayez de vous défendre. Si vous essayez simplement de vous cacher d’une inspection évidente, un encodage peut suffire (voir Android). .util.Base64, http://developer.Android.com/reference/Android/util/Base64.html ). Notez que l'encodage est AUCUNE SÉCURITÉ et que tout ce qu'il aura à faire sera de supprimer la référence évidente à votre site.
Si vous essayez de vous défendre contre quelque chose de plus, vous pouvez alors procéder au chiffrement de la chaîne. Pour ce faire, vous devez utiliser un chiffrement symétrique tel que AES via javax.crypto.Cipher, http://www.androidsnippets.org/ snippets/39/index.html fournit un exemple d'utilisation décent. Encore une fois, c’est plus gênant que d’être sûr d’être des hackers, car vous aurez besoin de stocker la clé quelque part dans votre pot, annulant ainsi toute sécurité cryptographique.
Pour clarifier cela, les étapes de base seraient les suivantes:
Avant:
public class Foo {
private String mySecret = "http://example.com";
...
}
Devient:
public class Foo {
private String encrypted = "<manually created encrypted string>";
private String key = "<key used for encryption";
private String mySecret = MyDecryptUtil.decrypt(encrypted, key);
...
}
Une (bonne) alternative à tout cela consiste à utiliser une solution tierce telle que le serveur de licences que Google fournit http://Android-developers.blogspot.com/2010/07/licensing-service-for-Android. html . Cela peut être plus sûr que quelque chose que vous faites vous-même, mais est soumis à des limitations très similaires à ce que j'ai décrit ci-dessus.
ce que j'ai fait était de créer une longue liste de chaînes statiques dans ma classe d'utilité globale. Quelque part dans la longue liste de chaînes, je mets mon mot de passe par plusieurs morceaux.
avec mon code, il est facile de voir quels sont les vrais mots de passe - mais une fois que l'obfuscateur se mettra au travail, toutes les statistiques statiques auront un nom tel que A, B, C, etc., et il ne sera plus facile de les repérer.
J'ai utilisé ROT47. Ce n'est pas très sécurisé, mais facile à utiliser et à mettre en œuvre, car c'est un encodeur/décodeur symétrique
Vous devriez chercher sur Google "Juste un autre pirate informatique Perl". Ce sont des programmes qui affichent une chaîne avec du code obscurci. Il y a aussi beaucoup d'exemples dans d'autres langues que Perl sur le net.
Vous pouvez utiliser DexGuard pour chiffrer des chaînes, probablement plus efficacement que vous ne pourriez le faire manuellement, sans alourdir le code source.