2010-12-05 28 views
20

Je voudrais crypter les cookies dans ASP.NET.Chiffrer les cookies dans ASP.NET

J'ai suivi the method in this article, mais il a l'inconvénient d'utiliser la réflexion sur une méthode interne. Cela l'a fait marquer dans une révision de code - il n'est pas à l'épreuve du futur car l'implémentation interne peut changer.

Existe-t-il une méthode avec des fonctionnalités identiques qui ne nécessite pas d'utiliser le cryptage sur les méthodes internes?

J'utilise .NET Framework 3.5 SP1 (On suppose que je ne peux pas changer les versions cadres)

Répondre

19

Pourquoi ne pas simplement utiliser the encryption found in System.Security.Cryptography pour chiffrer et déchiffrer le nom du cookie et de la valeur quand il est sensible? Vous pouvez écrire quelques fonctions utilitaires pour le gérer assez facilement. Exemple de fonctions utilitaires:

private static void SetEncryptedCookie(string name, string value) 
{ 
    var encryptName = SomeEncryptionMethod(name); 
    Response.Cookies[encryptName].Value = SomeEncryptionMethod(value); 
    //set other cookie properties here, expiry &c. 
    //Response.Cookies[encryptName].Expires = ... 
} 

private static string GetEncryptedCookie(string name) 
{ 
    //you'll want some checks/exception handling around this 
    return SomeDecryptionMethod(
       Response.Cookies[SomeDecryptionMethod(name)].Value); 
} 
+0

La méthode interne que j'ai mentionnée ajoute un peu de caractère aléatoire au cryptage de sorte que le texte crypté est différent à chaque fois. La méthode que vous avez mentionnée ne fonctionne pas - je pense. – frankadelic

+0

@frankadelic - une méthode d'incrémentation qui dépend de l'ajout de texte aléatoire pour rester sécurisé est, à mon avis, intrinsèquement erronée. Toute clé machine robuste ou tout autre chiffrement symétrique basé sur une clé privée devrait suffire. – jball

+2

hein? N'est-il pas recommandé d'ajouter du sel au hasard lors du cryptage des données? – frankadelic

30

Vous n'avez plus besoin de rouler les vôtres.

.Net 4.5 a MachineKey.Protect() et MachineKey.Unprotect().

System.Web.Security.MachineKey

.Net 4.0 a MachineKey.Encode() et MachineKey.Decode(). Vous devez simplement définir MachineKeyProtection sur 'All'. Ceux-ci sont maintenant obsolètes et vous devriez utiliser les plus récents si vous avez 4.5. Remarquez que si vous essayez de les utiliser dans quelque chose comme une application de console au lieu d'ASP.Net, il semble générer une nouvelle clé à chaque redémarrage de l'application. Je l'ai seulement vérifié rapidement mais dans ILSpy il semble qu'il génère ses propres valeurs par défaut si les app.setting appropriés sont manquants.

Je n'ai pas réussi à trouver un équivalent nonASP.Net.

+0

comment il peut être utilisé dans les fermes? où nous avons plusieurs serveurs derrière un load-balancer –

+7

Je suppose qu'ils devraient partager la même clé machine, que vous pouvez définir dans web.config plutôt que d'utiliser celle par défaut. Voir http://stackoverflow.com/questions/3855666/adding-machinekey-to-web-config-on-web-farm-sites et http://msdn.microsoft.com/fr-fr/library/ff649308.aspx # paght000007_webfarmdeploymentconsiderations – mattmanser