Les meilleures pratiques pour ranger et protéger les clés API dans les applications
La plupart des développeurs d'applications intégrera un tiers des bibliothèques dans leurs applications. Si c'est pour accéder à un service, tels que Dropbox ou YouTube, ou pour l'enregistrement des accidents. Le nombre de tiers de bibliothèques et de services est stupéfiant. La plupart de ces bibliothèques et les services sont intégrés, en quelque sorte, de l'authentification avec le service, la plupart du temps, cela se passe via une clé API. Pour des raisons de sécurité, les services génèrent habituellement un public et privé, souvent aussi appelé secret, la clé. Malheureusement, afin de se connecter aux services, cette clé privée doit être utilisé pour s'authentifier et donc, probablement partie de l'application.
Inutile de dire que cette confrontée à d'immenses problèmes de sécurité. Public et privé clés API peut être extraite de l'Apk dans une affaire de minutes et peut être facilement automatisé.
En supposant que j'ai quelque chose de semblable à cela, comment puis-je protéger le secret de la clé:
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
}
Quelle est à votre avis le meilleur et le plus sûr pour stocker la clé privée? L'Obfuscation, chiffrement, qu'en pensez-vous?
j'ai eu stocker dans image/png et d'obtenir par le biais de png BufferReader
OriginalL'auteur Basic Coder | 2013-01-28
Vous devez vous connecter pour publier un commentaire.
Comme il est, 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 dx.
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.
Note que la mise en place 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:
C'est une force brute approche; vous pouvez affiner une telle configuration, une fois le traité de demande de travaux.
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.
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.
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)
n'est-il pas une différence si la clé privée chaîne est stockée dans la classe Java vs dans la ressource de Chaîne XML?
Il est maintenant possible d'utiliser l'Android Keystore système pour stocker en toute sécurité les clés? ( developer.android.com/training/articles/keystore.html )
Avez-vous essayé d'utiliser le fichier de clés. Je veux coder une clé API écrite en Java de la classe. S'il vous plaît répondre
Est Android fichier de stockage des clés utiles pour cela? (developer.android.com/training/articles/...)
OriginalL'auteur Eric Lafortune
Quelques idées, à mon avis, seulement la première donne une certaine garantie:
Garder 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.
Mettre 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.
utilisation obfuscator, à mettre dans le code haché secret et, plus tard, sur unhash en cas de besoin à utiliser.
Mettre 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/
ouais, le nombre 1 ne donne aucune garantie.
J'aime vraiment l'idée de cacher les clés à l'intérieur des images. +1
Aimeriez-vous expliquer plus en détail(avec des exemples ou ciselée code de préférence) à propos de suite la solution? Je vous remercie.
ceci est appelé la stéganographie, son chemin trop complexe pour donner un exemple de code ici, vous pouvez trouver des exemples sur google. J'ai trouvé un ici: dreamincode.net/forums/topic/27950-steganography. L'idée est excellente mais depuis apk code peut être décompilé qu'il gâche sa beauté.
OriginalL'auteur marcinj
De suivre 3 étapes simples pour sécuriser API/clé Secrète
Nous pouvons utiliser Gradle pour fixer la clé de l'API ou de la clé Secrète.
1. gradle.properties (propriétés du Projet) : Créer une variable avec la clé.
2. construire.gradle (Module: app) : Définir la variable dans la construction.gradle pour accéder à l'activité ou du fragment. Ajouter le code ci-dessous pour buildTypes {}.
3. L'accès en Activité/Fragment par application BuildConfig :
Mise à jour :
La solution ci-dessus est utile dans le projet open source d'engager plus de Git. (Merci à David Rawson et riyaz-ali pour votre commentaire).
Que par l'Matthieu et Pablo Cegarra commentaires de la façon décrite ci-dessus n'est pas sécurisé et Decompiler permettra à quelqu'un pour afficher l'BuildConfig avec nos clés secrètes.
Solution :
Nous pouvons utiliser NDK pour Sécuriser les Clés API. Nous pouvons stocker les clés dans le natif C/C++ de la classe et de l'accès dans nos classes Java.
Veuillez suivre cette blog pour sécuriser les clés API à l'aide de NDK.
Un suivi sur la façon de stocker les jetons de sécurité dans Android
ne devrait pas être vérifiée Git donc, c'est une façon de garder le secret de commis de code source, au moins
Ce qui n'empêche pas la clé API d'être livré dans la
apk
(il sera ajouter à la généréesBuildConfig
fichier), bien que ce est certainement une bonne idée pour gérer les différentes API de clés (par exemple, dans un projet open source)À l'aide d'un Java Decompiler permettra à quelqu'un pour afficher l'BuildConfig fichier et "GoogleSecAPIKEY"
vraiment 11 upvotes? juste de décompiler, de cordes ouvertes et voilá
OriginalL'auteur SANAT
Une autre approche est de ne pas avoir le secret sur l'appareil en premier lieu! Voir Mobile API Techniques de Sécurité (surtout la partie 3).
À l'aide de la plus pure tradition de l'indirection, partager le secret entre votre API d'extrémité et une application de service d'authentification.
Lorsque votre client veut faire un appel d'API, il demande l'application de service de demenagement pour authentifier (à l'aide d'une forte distance attestation techniques), et il reçoit en un temps limité (généralement JWT) jeton signé par le secret.
Le jeton est envoyé avec chaque appel d'API où le point de terminaison peut vérifier sa signature avant d'agir sur la demande.
Le véritable secret est de ne jamais présent sur l'appareil; en effet, l'application n'a jamais d'idée si elle est valide ou pas, il s'avance demandes d'authentification et passe sur le jeton. Comme une belle prestation de l'indirection, si jamais vous voulez changer le mot de passe, vous pouvez le faire sans demander aux utilisateurs de mettre à jour leurs applications installées.
Donc, si vous voulez protéger votre secret, ne pas l'avoir dans votre application, en premier lieu, est une très bonne façon d'aller.
OriginalL'auteur Skip Hovsmith
Une solution possible est d'encoder les données dans votre application et de l'utilisation de décodage au moment de l'exécution (lorsque vous souhaitez utiliser des données). Je vous recommande également d'utiliser progaurd à faire du mal à lire et comprendre le décompiler le code source de votre application . par exemple, j'ai mis une clé codée dans l'application et ensuite utilisé un décoder méthode dans mon appli pour décoder mes clés secrètes à l'exécution:
Décompilé le code source d'un proguarded app est: est-ce
Au moins, c'est assez compliqué pour moi. c'est la façon dont je le fais quand j'ai pas le choix, mais de stocker une valeur dans mon application. Bien sûr, nous savons tous que C'est pas la meilleure façon mais cela fonctionne pour moi.
Décompilé version:
et vous pouvez trouver de nombreuses encryptor classes avec un peu de recherche dans google.
OriginalL'auteur Milad Faridnia
pour ces gars-là, il ne sera pas masquer, verrouiller la
ProGuard
le code. C'est un peu de remaniement et de certains payé obfuscators sont l'insertion de quelques opérateurs au niveau du bit pour obtenir le retour à lajk433g34hg3
Chaîne de caractères. Vous pouvez faire 5 et 15 min plus le piratage si vous travaillez 3 jours 🙂
Meilleure façon est de le garder tel qu'il est, à mon humble avis.
Même si vous les conservez à côté serveur( votre PC), la clé peut être piraté et imprimés. Peut-être ce qui prend le plus de temps? De toute façon c'est une question de quelques minutes ou de quelques heures dans le meilleur des cas.
Un utilisateur normal ne sera pas décompiler votre code.
désolé, il n'est pas comme vous le souhaitiez un brillinant, ultra sécuritaire de la solution, mais pour ceux qui peuvent utiliser le compilateur, decompiler il n'est pas sûr de code java: même le code natif peut être visualisé avec hexa spectateur et decrtyped. Au moins la peine d'essayer...
Proguard l'habitude de dissimuler la véritable clé si..? La meilleure chose à faire est simple encript/decript de routine, que obscurcir va se cacher.
il est "visible" de la routine de déchiffrement, il est facile de faire l'inverse et vous avez de la chaîne d'origine
OriginalL'auteur
Cet exemple a un certain nombre de différents aspects. Je vais mentionner quelques points que je ne pense pas avoir été explicitement couverts par ailleurs.
Protéger le secret en transit
La première chose à noter est que l'accès à l'API dropbox à l'aide de leur l'authentification d'application mécanisme requiert que vous transmettiez votre clé et le secret. La connexion HTTPS, ce qui signifie que vous ne pouvez pas intercepter le trafic sans connaître le certificat TLS. C'est pour empêcher une personne de l'interception et la lecture des paquets sur leur voyage à partir de l'appareil mobile vers le serveur. Pour les utilisateurs normaux, c'est vraiment une bonne façon d'assurer la confidentialité de leur trafic.
Ce qu'il n'est pas bon, c'est de prévenir une personne malveillante du téléchargement de l'application et inspecte le trafic. Il est vraiment facile à utiliser un man-in-the-middle proxy pour l'ensemble du trafic dans et hors d'un appareil mobile. Il ne nécessiterait pas de démontage ou de reverse engineering de code pour extraire l'application de la clé et le secret dans ce cas, en raison de la nature de l'API Dropbox.
Vous pourriez faire l'épinglage qui vérifie que le certificat TLS vous recevoir à partir du serveur est celui que vous attendez. Cela ajoute une case pour le client et le rend plus difficile à intercepter le trafic. Ce serait plus difficile pour inspecter le trafic en vol, mais l'épinglage de vérifier qui se passe dans le client, de sorte qu'il serait probablement toujours être possible de désactiver l'épinglage de test. Il est plus difficile cependant.
Protéger le secret au repos
Comme une première étape, en utilisant quelque chose comme proguard aidera le rendre moins évident où les secrets sont organisées. Vous pouvez également utiliser le NDK pour stocker les clés et les secrets et les envoyer directement des demandes, ce qui permettrait de réduire considérablement le nombre de personnes ayant les compétences appropriées pour extraire l'information. Plus de dissimulation peut être obtenue en ne stockant pas les valeurs directement dans la mémoire, pour toute longueur de temps, vous pouvez crypter et décrypter juste avant de l'utiliser comme suggéré par une autre réponse.
Options plus avancées
Si vous vous êtes paranoïaque à propos de mettre le secret de n'importe où dans votre application, et vous avez du temps et de l'argent à investir dans des solutions plus complètes, alors vous pourriez envisager de stocker les informations d'identification sur vos serveurs (si vous en avez). Cela permettrait d'augmenter le temps de latence de tous les appels à l'API, ce qui aura pour communiquer par l'intermédiaire de votre serveur, et pourrait augmenter les coûts de fonctionnement de votre service en raison de l'augmentation du débit de données.
Ensuite, vous devez décider de la meilleure façon de communiquer avec votre serveurs pour s'assurer qu'ils sont protégés. Ceci est important pour prévenir tous les mêmes problèmes à venir de nouveau avec votre API interne. La meilleure règle que je puisse donner est de ne pas transmettre tout secret directement à cause de l'homme-dans-le-milieu de la menace. Au lieu de cela, vous pouvez signer le trafic à l'aide de votre secret et de vérifier l'intégrité de toutes les demandes qui viennent à votre serveur. Un standard de la façon de le faire est de calculer un HMAC du message à la clé sur un secret. Je travaille dans une entreprise qui a un produit de sécurité qui fonctionne également dans ce domaine et c'est pourquoi ce genre de choses m'intéresse. En fait, ici, est un blog article de l'un de mes collègues qui passe au-dessus de la plupart de cette.
Combien devrais-je faire?
Avec tous les conseils de sécurité comme cela, vous devez faire un rapport coût/avantage de décision au sujet de la façon dont vous voulez le faire pour quelqu'un à l'effraction. Si vous êtes une banque de protéger des millions de clients, votre budget est totalement différent de quelqu'un soutien à une application dans leur temps libre. Il est pratiquement impossible d'empêcher quelqu'un de la rupture de votre système de sécurité, mais dans la pratique peu de gens ont besoin de toutes les cloches et de sifflets et avec certaines précautions de base, vous pouvez obtenir un long chemin.
Je suis d'accord qu'il devrait avoir cité l'article que vous avez lié, mais il peut avoir oublié parce que les deux travailler dans le même endroit...
Également Ignorer de l'article et le blog, ils sont basés sur des est sorti une semaine après ma réponse.
OriginalL'auteur ThePragmatist
La solution la plus sûre est de garder vos clés sur un serveur et de la route de toutes les demandes nécessitant que par le biais de votre serveur. De cette façon, la clé ne quitte jamais votre serveur, donc tant que votre serveur est sécurisé alors il en est de votre clé. Bien sûr, il y a un coût de performance avec cette solution.
Ce n'est pas vrai, votre serveur est entièrement sous votre contrôle. Ce qu'il exige, c'est entièrement à vous.
Pouvez-vous expliquer ici comment le client peut crypter les données qu'il veut envoyer vers le serveur, alors que les clés sont dans le serveur ? et si votre réponse sera - Le serveur envoie les clés pour le client, de Sorte que doit être garanti! donc encore une fois pas de solution magique! ne pouvez-vous pas voir?!
et puis, de nouveau, nous sommes de retour à carré de 1. Supposons, le téléphone crée un hasard de connexion et le serveur accepte et envoie un code pin(C'est le serveur privé nous parlons). Ensuite, la personne qui démonte votre app voit que tout ce qu'il faut pour accéder à votre privé serveur est juste un hasard de connexion qu'il peut créer lui-même. Dites-moi ce qui empêche d'en créer un et l'accès à votre serveur? En effet, quelle est la différence entre la solution et le fait de stocker un identifiant de connexion ou clé api pour le serveur principal (dont les informations d'identification que nous voulions stocker dans notre serveur privé)
Le nombre aléatoire est authentifié sur le numéro de téléphone et l'accès à ses messages texte. Si quelqu'un triche, vous disposez de leurs informations. Si ce n'est pas assez de force pour créer un compte d'utilisateur et le mot de passe. Si ce n'est pas assez bon obtenir une carte de crédit trop. Si ce n'est pas assez de les faire appeler. Si ce n'est pas assez de les rencontrer face à face. Comment sécuriser/incommode voulez-vous être?
OriginalL'auteur Bernard Igiri
L'ajout de @Manohar Reddy solution, firebase Base de données ou de firebase RemoteConfig (avec Null valeur par défaut) peut être utilisé:
Ce qui est différent dans cette solution?
le privilège de faire des appels de l'API
les appels déjà https pour firebase
OriginalL'auteur Ayman Al-Absi
Âges vieux post, mais encore assez bon. Je pense que de les cacher dans un .donc, bibliothèque serait génial, à l'aide de NDK et C++ bien sûr. .les fichiers peuvent être visualisés dans un éditeur hexadécimal, mais bonne chance pour la décompilation 😛
Selon androidauthority.com/... il n'y a pas de moyen sûr de le faire dans android pour le moment.
Ne comprends pas pourquoi ce qui est d'avoir les 3 upvote. n'importe qui pourrait facilement décompiler l'application et de voir comment le ndk point d'entrée sont appelés :/
Cette réponse est presque l'une des meilleures options, mais l'auteur doit mentionner qu'il est très important que vous devriez inclure un appel (à l'intérieur de votre NDK bibliothèque) pour voir si la somme de contrôle correspond à votre APK car sinon, quelqu'un peut appeler votre NDK bibliothèque en dehors de votre application
ce serait génial, sauf qu'il y a un gros problème. Comment savez-vous ce fichier est "en l'appelant" la méthode native? Si vous coder en dur le nom de l'apk pour vérifier, très bien, mais ce que si je fais mon "hack" apk le même dossier que le "bon" apk? Elle permet de vérifier que le "bon" apk a une bonne somme de contrôle, et il va me permettre de mettre en œuvre cette méthode native. Sauf si il y a un moyen de savoir les appelant fichier à partir de la JNI/C++ côté, alors il est inutile que les autres options.
OriginalL'auteur Ahmed Awad
Ce que vous faites pour sécuriser vos clés secrètes ne va pas être une réelle solution. Si un développeur peut décompiler l'application il n'y a aucun moyen de garantir la clé, de cacher la clé est juste la sécurité par l'obscurité et est donc obfuscation du code. Problème avec l'obtention d'une clé secrète est que, pour sûr, vous devez utiliser une autre clé et cette clé doit également être assurée. Pensez à une clé cachée dans une boîte qui est verrouillé avec une clé. Vous placez une boîte à l'intérieur d'une chambre et de verrouillage de la chambre. Vous êtes de gauche avec une autre clé de la sécurité. Et que la clé est toujours en cours d'être codé en dur à l'intérieur de votre application.
De sorte que si l'utilisateur entre un code PIN ou un membre de phrase il n'y a aucun moyen de cacher la clé. Mais pour cela, vous devez disposer d'un système pour la gestion de PINs qui se passe hors de la bande, ce qui signifie par le biais d'un autre canal. Certainement pas pratique pour la sécurisation des clés pour des services comme Google Api.
OriginalL'auteur user1611728
Garder le secret dans
firebase database
et obtenir de lui lorsque l'application démarre ,Il est beaucoup mieux que d'appeler un service web .
Malheureusement, Firebase de la base de données ne fonctionne pas en Chine.
ne fait pas de sens, les attaquants peuvent voir que vous firebase détails de décompiler le code et récupérer les données à partir de votre datababse
Je pense que c'est la meilleure solution que firebase Apps utilise SHA1 pour permettre l'accès au serveur. La décompilation du code n'aidera pas à faire appel à firebase parce que hacker nouvelle application doit utiliser exacte application de timbre pour l'accès firebase. Aussi, la clé stockée doit être chiffré avant de le ranger dans firebase DB et déchiffré une fois reçues pour éviter un homme au milieu d'une interception.
Lorsque vous obtenez le secret de la firebase base de données à travers le réseau, comment ça se fait de plus sûr que d'obtenir le même secret à partir d'un autre service web par le biais d'un système sécurisé (https) canal? Pouvez-vous expliquer?
OriginalL'auteur Manohar Reddy
Le seul vrai moyen de garder ces privé est de les garder sur votre serveur, et l'application d'envoyer quoi que ce soit pour le serveur, et le serveur interagit avec Dropbox. De cette façon, vous ne JAMAIS distribuer votre clé privée dans n'importe quel format.
Si par "le serveur" vous voulez dire que votre serveur web où les informations d'identification sont - vous pouvez utiliser n'importe quelle méthode que vous souhaitez. simple d'authentification avec nom d'utilisateur / mot de passe, oauth, active directory, etc. etc. Dépend vraiment de votre application.
Peut-être que je manque quelque chose, mais n'est-ce pas encore besoin de stocker ces informations dans l'application?
Droit, mais vous avez dit que l'application serait de s'authentifier auprès du serveur en premier. N'est-ce pas le moyen de stocker d'autres informations d'identification dans l'application? Je comprends le serveur serait en mesure de gérer le réel dropbox appels.
Eh bien, cela pourrait signifier que, mais il complètement distincte de l'autorisation. Mais vous n'avez pas à. Le cas d'utilisation dont je parle est une application d'utilisateur de connexion à votre application, en utilisant facebook ou twitter. Vous n'avez pas stocker leurs informations d'identification dans votre application, vous ne savez même pas. Cette autorisation permet d'accéder à votre serveur d'api, qui a les titres de la sélection, mais aucune application ou de l'utilisateur a accès à eux directement.
OriginalL'auteur Nick
Basé sur l'amère expérience, et après consultation avec l'IDA Pro expert la meilleure solution est de déplacer une partie de la clé du code dans une DLL/SharedObject, puis l'extraire à partir d'un serveur et de les charger à l'exécution.
Données sensibles doivent être codées comme il est très facile de faire quelque chose comme ceci:
OriginalL'auteur RonTLV