2011-02-08 7 views
8

Mon application touche un certain nombre de services Web, tels que Twitter et Flickr. Il utilise des clés API de ces services, et j'aimerais les masquer dans mes binaires. (Je ne suis pas vraiment inquiet au sujet du piratage ou quoi que ce soit, je dois juste garder ces clés secrètes.)Comment protéger une clé API dans une application .NET

Quelle est la meilleure façon de s'y prendre?

Si je les stocke comme const SecureString, cela les empêche-t-il de mémoire? La description de MSDN indique que le texte est "supprimé de la mémoire de l'ordinateur quand n'est plus nécessaire", mais n'est pas toujours un const dans la mémoire?

Est-ce que Dotfuscator l'obscurcira dans mon assemblage? (En supposant que je peux l'obtenir à work.)

+2

Vous ne pouvez pas. Si un attaquant malveillant veut votre clé API, obscurcir votre binaire ne les empêchera pas d'y accéder. N'importe qui d'autre ne sait pas quoi faire avec la clé de toute façon. –

+0

Je pense que SecureString aggraverait la situation. Puisque c'est un gros signe disant "Regarde-moi, je suis si secret".SecureString protège contre des choses comme l'échange d'une clé sur le disque mais pas contre une malveillance utilisée. – CodesInChaos

+0

Et l'interception de votre requête http (s) sur Twitter devrait être triviale. – CodesInChaos

Répondre

4

Anon est correct, il n'y a aucun moyen de protéger complètement les données; quelqu'un peut toujours l'obtenir.

Mais vous voulez le rendre aussi difficile que possible. Cela ne signifie pas faire les choses qui le rendent facile à lire:

  • ne pas stocker dans une clé de Registre (par exemple TwitterAPIKey REG_SZ)
  • ne pas stocker dans un fichier texte (par exemple twitterkey.txt), ou dans un fichier ini
  • ne pas stocker dans le fichier .config de l'application
  • ne pas stocker sous forme de texte dans le
  • binaire
  • ne pas stocker non crypté dans le
binaire

Cela laissera les gens qui doivent avoir connaissance d'un débogueur, et (éventuellement) du code de l'assemblée.

Vous avez beaucoup réduit la surface d'attaque.

Suivez juste les trois premières suggestions et vous serez sur votre chemin.

8

J'ai récemment dû faire face exactement à cette situation. Le problème n'est pas tellement de s'assurer que quelqu'un ne peut pas facilement le trouver en utilisant un éditeur hexadécimal, mais plutôt quand il est envoyé par câble aux différentes API. Il suffit de lancer le violoneur et d'écouter les demandes pour afficher la clé. Certaines API auront l'avantage d'une clé privée/publique ce qui aide un peu.

La seule solution que je pouvais trouver était de créer un service web de mon propre hébergé en externe qui servait de proxy entre le client et l'API ciblée. Cela m'a permis de générer des clés individuelles pour chaque terminal que je pouvais activer/désactiver et la majorité des données sensibles étaient stockées sur mon application proxy distante.

Bonne chance!

~ « Dont't oublier de boire votre Ovomaltine »

+0

Est-il possible que vous postiez un exemple de code pour votre solution? ou expliquant plus comment cela fonctionne – Smith

0

vous pouvez peut-être demander à votre utilisateur d'utiliser leurs propres clés api. Ils peuvent s'enregistrer sur les API, puis référencer leur clé dans les paramètres de votre application

+0

Ce serait un non-démarreur pour les applications mobiles –

Questions connexes