J'ai besoin de quelques idées sur la façon de protéger une clé API privée dans une application, en particulier dans une application ac # .NET.
Tout d'abord, je comprends qu'il est théoriquement impossible de cacher quoi que ce soit dans le code source, j'ai donc proposé une autre idée, mais je ne sais pas à quel point c'est plausible. Quoi qu'il en soit, serait-il possible de communiquer d'une manière ou d'une autre avec un serveur Web pour vérifier la clé privée, puis de répondre à l'application pour confirmer qu'il s'agit d'une poignée de main légitime?
J'ai deux clés avec lesquelles travailler: une clé publique (comme son nom l'indique, elle n'a pas besoin d'être traitée avec le même soin que la privée) et une clé privée, qui doit être protégée des autres.
Toutes les idées sur la façon dont je pourrais faire ceci seraient considérablement appréciées.
la source
Réponses:
Résumer:
La meilleure façon d'empêcher la compromission de cette clé est d'en garder le contrôle. Cela signifie qu'il ne doit jamais être déployé sur un serveur où n'importe qui d'autre que vous pourrait lire le binaire, et ne jamais passer par un lien de communication que vous ne contrôlez pas.
En fin de compte, si les fichiers binaires sont hors de votre contrôle, tout ce qu'ils contiennent est hors de votre contrôle. De même, si quelqu'un peut intercepter le trafic, il peut capturer la clé API ( potentiellement même si vous utilisez SSL ).
Je peux voir deux façons principales d'accomplir cela, qui n'incluent pas toutes les deux votre clé API privée dans votre application déployée:
Obtenez une clé API unique pour chaque déploiement
Cela nécessiterait une relation supplémentaire avec le fournisseur, où vous pouvez obtenir des clés ou demander à vos clients d'obtenir des clés.
C'est en fait assez courant avec, par exemple, les produits qui utilisent l'API Google Maps. Le créateur du logiciel a sa propre clé qu'il utilise lors du développement / de l'exécution de sa copie, mais il ne l'inclut pas dans le logiciel et, à la place, vous oblige, en tant qu'utilisateur installant ledit logiciel, à aller sur Google et à obtenir votre propre API clé. Le logiciel a simplement une option de configuration pour définir la clé API Google Maps à utiliser.
En fait, de nombreux fournisseurs qui émettent des clés d'API exigent contractuellement que vous fassiez les choses de cette façon, de sorte que vous pouvez même être sur le mauvais chemin de toute façon, et cela peut être la seule solution que vous êtes autorisé à utiliser conformément aux conditions d'utilisation du fournisseur et / ou tout contrat légal que vous pourriez avoir avec eux.
Utilisez un proxy
Configurez une API proxy, où votre application appelle votre API (sur vos serveurs) et, à son tour, votre API appelle l'API du fournisseur à l'aide de la clé.
Vous pouvez avoir besoin d'une protection supplémentaire sur votre API, par exemple, quelque chose pour vous assurer que seule votre application l'utilise. Cela pourrait être fait par:
La chose à garder à l'esprit ici est que vous ne pouvez pas être autorisé à le faire. Votre fournisseur peut avoir des conditions d'utilisation ou des contrats légaux qui vous empêchent de créer un "service d'agrégation" ou un proxy, vous devez donc vérifier cela.
Gérer les mauvais comportements
Même si votre clé n'est pas compromise, si l'un de vos clients fait quelque chose qui oblige le fournisseur à bloquer votre clé, soudain TOUS vos clients sont désactivés, et votre seul correctif est de mettre à jour tout le monde.
De même, si vous souhaitez bloquer l'un de vos clients (par exemple, ils ont cessé de payer, ont piraté le logiciel, etc.), vous ne pouvez pas le faire sans publier une mise à jour pour tout le monde, puis désactiver la clé.
La logistique de tout cela au-delà d'une poignée de clients deviendra rapidement intenable.
Que vous agissiez en tant que proxy ou ayez une clé unique pour chaque installation, vous pouvez gérer n'importe laquelle de ces situations relativement facilement (et avec peu ou pas d'impact pour quiconque).
Essayer de protéger la clé lorsqu'elle est intégrée à votre logiciel est finalement un effort futile. Peu importe ce que vous faites, tout attaquant qui a accès aux binaires, à la source et / ou au canal de communication et qui est suffisamment déterminé pour accéder à sa clé pourra le faire.
Alors ne l'intégrez pas. "Le seul coup gagnant n'est pas de jouer."
la source
Si vous avez une clé dans le code objet, elle est publique par définition. Il existe des hacks autour des obfuscateurs qui décompilent rapidement le code objet. Une clé privée serait en dehors du code objet et dans un autre fichier. La partie difficile est de fournir cette clé privée à l'utilisateur. Une fois qu'il est fourni, vous pouvez utiliser une signature de la clé privée, collée à la fin du fichier, et une clé publique dans l'application, pour vérifier l'intégrité de la clé privée. Un serveur Web peut également effectuer cette vérification, si vous disposez d'un canal de communication sécurisé.
la source