web-dev-qa-db-fra.com

Comment puis-je intégrer en toute sécurité une chaîne statique (clé) en C #?

Je cherche un moyen de stocker en toute sécurité une clé API dans une application WP7. La clé est une chaîne et est actuellement codée en dur dans le code (voir ci-dessous). Je sais que quelqu'un avec un programme de réflecteur pourrait facilement voir cela. Existe-t-il un meilleur moyen de regrouper cette clé dans le cadre de mon application? Une ressource serait-elle plus sûre?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt";

(Ce n'est pas vraiment la clé;))

Merci d'avance.

50
Chris Gonzales

Jetez un oeil à Chaînes de connexion de base de données de sauvegarde et autres paramètres sensibles dans votre code , c'est une bonne lecture. Votre question se trouve dans la section "Masquage des clés dans le code source de l'application".

Extrait:

Si vous définissez la clé dans l'application, en plus d'obscurcir l'assembly, essayez de ne pas stocker les octets de clé réels dans le code source. Au lieu de cela, implémentez une logique de génération de clés en utilisant des caractéristiques persistantes, telles que l'algorithme de chiffrement, la taille de la clé, la phrase de passe, le vecteur d'initialisation et le sel (voir un exemple sur Chiffrer et déchiffrer les données à l'aide d'une clé symétrique (Rijndael) =). Cela introduira une couche supplémentaire d'indirection, de sorte que la clé ne sera pas accessible en vidant simplement les symboles du binaire de l'application. Tant que vous ne modifiez pas la logique de génération de clé et les caractéristiques de la clé, la clé résultante est garantie identique. Il peut également être judicieux de ne pas utiliser de chaînes statiques comme caractéristiques de génération de clés, mais plutôt de les créer à la volée. Une autre suggestion serait de traiter l'Assemblée de la même manière que le magasin de données devrait être traité, c'est-à-dire en appliquant les listes de contrôle d'accès appropriées. Et n'utilisez cette option qu'en dernier recours, lorsqu'aucune des autres techniques de protection des données ne fonctionne et que votre seule alternative consiste à laisser les données sensibles non chiffrées.

22
maka

J'ai lu toutes ces réponses et je ne pense pas qu'il soit possible d'intégrer cela en toute sécurité, quel que soit l'endroit où vous le mettez ou comment vous le masquez. Tant qu'il est dans votre XAP et décodé dans l'application, il sera toujours disponible pour le piratage.

Si vous devez expédier la clé à l'intérieur du xap avec un degré de protection raisonnable, alors je pense que la réponse de @ maka donne votre meilleur pari - obscurcissez-la du mieux que vous pouvez - mais ne pense pas que cela vous sécurisera - c'est-à-dire ne le faites pas faites-le pour vos applications bancaires mobiles!

Alternativement, si vous avez vraiment besoin de sécurité, n'utilisez pas uniquement l'application - utilisez également un serveur Web. Par exemple, si vous faisiez une application Facebook et que vous deviez en quelque sorte protéger votre clé secrète Facebook, vous devrez rediriger l'utilisateur de votre application vers une page Web sur votre serveur pour l'authentification. Cette page Web devrait ensuite guider l'utilisateur à travers le processus d'obtention d'un jeton d'accès - et ensuite ce jeton d'accès (avec l'appid public) devrait revenir à votre application. Et pour les services Web qui nécessitent la connaissance de la clé secrète pour accompagner chaque appel, alors je crains que chaque appel ne doive probablement passer par votre serveur.

11
Stuart

Vous pouvez crypter la clé Api avec ProtectedData puis la décrypter lors de l'exécution. C'est un bon tutoriel pour crypter des données dans Windows Phone: Cryptage dans Mango

5
Ku6opr

Peut-être que vous pouvez le crypter à l'avance et l'enregistrer dans app.config. Et en le lisant, déchiffrez-le en utilisant le même algorithme.

0
Dipesh Bhatt

Vous pouvez utiliser DotFuscator pour désactiver la possibilité d'utiliser le réflecteur. Mais cela ne vous permettra pas de changer la clé sans recompiler.

Dans le passé, j'ai utilisé la méthode suivante dans d'autres logiciels (basés sur le Web/Winform):

http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx

0
Peter R

Ce n'est peut-être pas une réponse, mais c'est une suggestion:

Stockez la clé cryptée dans une base de données. Et stockez le "mot de passe db" chiffré dans app.config.

  1. Utilisez deux algorithmes de chiffrement/déchiffrement de chaîne appropriés, disons algorithmes x et y.
  2. Mettez le mot de passe db chiffré dans app.config avant de le publier.
  3. Décryptez le mot de passe app.config (algo y) pour connecter la base de données pour prendre une nouvelle chaîne encryptée (vraie).
  4. Fermez la connexion et décryptez la nouvelle chaîne avec l'algorithme x si réflecteur/etc. ne pas courrir.
  5. Utilise le.
  6. Jetez l'objet qui contient la chaîne.
0
Lost_In_Library