425 votes

Meilleures pratiques pour stocker des clés privées de API dans Android

Je développe une application, puis-je utiliser plusieurs tiers Api et Sdk, tels que Dropbox et Google Drive. Ces bibliothèques prevoit clés API. L'une privée et une publique.

Actuellement, j'ai qqch comme ceci:

public class DropboxService  {

    private final static String APP_KEY = "jk433g34hg3";
    private final static String APP_SECRET = "987dwdqwdqw90";
    private final static AccessType ACCESS_TYPE = AccessType.DROPBOX;

    // SOME MORE CODE HERE

}

L'App-clé Secrète doit être maintenu privé - mais lors de la libération de l'application peut être inversé par certains mecs.

Je veux savoir quelle est la meilleure chose à chiffrer, coder ou que ce soit pour faire de cette sécurité.

J'ai pensé à l'aide de ProGuard mais la mise en ProGuard pour l'ensemble du projet serait de me prendre quelques semaines. C'est pourquoi j'ai voulu seulement à utiliser ProGuard pour ces importantes classes de stockage des clés privées et autres sensitible de données.

Est-ce ok ou il existe d'autres moyens? Qu'en pensez-vous?

383voto

Eric Lafortune Points 17656
  1. Comme il est de votre application compilée contient la clé des chaînes, mais aussi les noms de constantes APP_KEY et APP_SECRET. L'extraction de clés à partir d'une telle auto-documenter le code est trivial, par exemple avec la norme Android outil de dx.

  2. Vous pouvez appliquer ProGuard. Il laissera la clé des chaînes intacte, mais il va supprimer les noms de constantes. Il permettra également de renommer les classes et les méthodes à court, sans noms, dans la mesure du possible. L'extraction de touches, puis prend un peu plus de temps, pour décider de la chaîne qui sert de but.

    Notez que la configuration ProGuard ne devrait pas être aussi difficile que vous avez peur. Pour commencer, il vous suffit d'activer ProGuard, comme indiqué dans le projet.les propriétés. Si il y a des problèmes avec les bibliothèques de tiers, vous devrez peut-être supprimer certaines mises en garde et/ou de les empêcher d'être occulté, dans proguard-project.txt. Par exemple:

    -dontwarn com.dropbox.**
    -keep class com.dropbox.** { *; }
    

    C'est une force brute approche; vous pouvez affiner une telle configuration, une fois le traité de demande de travaux.

  3. Vous pouvez dissimuler les chaînes manuellement dans votre code, par exemple avec un encodage Base64 ou, de préférence, avec quelque chose de plus compliqué, peut-être même code natif. Un hacker va alors statiquement la rétro-ingénierie de l'encodage ou de façon dynamique intercepter le décodage dans le bon endroit.

  4. Vous pouvez appliquer un commercial obfuscator, comme ProGuard est spécialisée frère DexGuard. Il peut en outre chiffrer/masquer les cordes et les classes pour vous. L'extraction de touches, puis prend encore plus de temps et d'expertise.

  5. Vous pourriez être en mesure d'exécuter les parties de votre application sur votre propre serveur. Si vous pouvez garder les clés de là, ils sont en sécurité.

En fin de compte, c'est économique, ce que vous avez à faire: quelle est l'importance des touches, comment beaucoup de temps ou de logiciel ne peut vous le permettre, le degré de sophistication sont les pirates qui sont intéressés dans les keys, de combien de temps ils veulent passer, que vaut un délai avant que les touches sont piratés, sur ce que l'échelle, la réussite de tout les pirates distribuer les clés, etc. De petits morceaux d'informations comme les touches sont plus difficiles à protéger que de l'ensemble des applications. Intrinsèquement, rien sur le côté client est incassable, mais vous pouvez certainement élever la barre.

(Je suis le développeur de ProGuard et DexGuard)

86voto

marcin_j Points 12237

Quelques idées, à mon avis, seulement la première donne une certaine garantie:

  1. Gardez vos secrets sur un serveur sur internet, et si nécessaire, il suffit de le saisir et de les utiliser. Si l'utilisateur est sur le point d'utiliser dropbox, puis rien ne vous empêche de faire votre demande à votre site et obtenir votre clé secrète.

  2. Mettez vos secrets dans jni code, ajouter un peu de code variable, pour faire de vos bibliothèques de plus en plus difficile de le décompiler. Vous pouvez également diviser la clé de chaîne dans quelques parties, et de les conserver dans des endroits différents.

  3. utilisation obfuscator, à mettre dans le code haché secret et, plus tard, sur unhash en cas de besoin à utiliser.

  4. Mettez votre clé secrète en dernier pixels de votre image dans les actifs. Puis, quand nécessaire lire dans votre code. D'obscurcir votre code doit aider à cacher le code qui va le lire.

Si vous voulez avoir un aperçu rapide de la façon dont il est facile à lire vous apk code puis saisir APKAnalyser:

http://developer.sonymobile.com/knowledge-base/tool-guides/analyse-your-apks-with-apkanalyser/

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