Meilleure façon de stocker les clés de cryptage in.NET C#

Dans notre application, nous avons beaucoup de sensibles paramètres de configuration sont stockés dans un fichier xml qui est encore chiffré.

ce fichier sécurisé doit être déchiffré à l'exécution et les valeurs de configuration doivent être lues. mais un problème se pose: la clé et le vecteur d'initialisation sont codés en dur dans le code et donc n'importe qui peut le lire en utilisant le réflecteur.

Quelle est la meilleure façon de stocker les clés de cryptage dans .NET pour que personne ne puisse les lire en utilisant Réflecteur?

57
demandé sur ganeshran 2011-02-11 12:17:45

7 réponses

si vous souhaitez protéger vos données contre d'autres utilisateurs. Jetez un oeil à la classe ProtectedData .

(clause de non-responsabilité: la protection de vos données pour créer un système de protection contre la copie n'est pas couverte par cette réponse).

cette classe utilise le DPAPI de Windows, pour chiffrer et déchiffrer des données au niveau de l'utilisateur ou de la machine.

L'utilisation de ProtectedData / DPAPI vous libère de la manipulation des clés et de la sécurisation des données vous-même. Et vous pouvez choisir de protéger les données de l'utilisateur actuel. Les données peuvent être lues à partir d'ordinateurs différents, par les mêmes utilisateurs du domaine.

Si vous voulez créer votre propre clé. Vous pouvez créer une clé d'utilisateur/machine, et de stocker cette clé dans le registre. Comme le Registre peut être sécurisé, seul l'utilisateur courant peut relire la clé. Je sais que le registre a un mauvais karma, mais il est en fait très bon pour stocker des données comme celles-ci.

PS: ne mettez pas L'IV dans votre code. Créez une nouvelle IV à chaque fois, et mettez-la devant les données.

18
répondu GvS 2011-02-11 09:45:46

si vous ne pouvez pas les lire dans le réflecteur, comment vous attendez-vous à ce que le programme les lise? Vous pourriez les obscurcir en les brisant et en stockant les pièces partout, mais (AFAIK) une fois que vous avez besoin de votre programme pour être capable de les lire, alors n'importe qui ayant accès à votre code peut les lire aussi.

N'oubliez pas les valeurs en mémoire peut être consulté, ainsi ( toux SecureString).

9
répondu Massif 2011-02-11 09:27:50

vous devez utiliser le Keystore de la Machine, c'est un stockage sécurisé en particulier à cette fin. Par exemple:

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

où KEYNAME est une chaîne personnalisée qui peut être utilisée pour récupérer la clé plus tard.

pour plus d'exemples, voir la question: comment stocker une clé publique dans un conteneur de clés RSA de niveau machine

8
répondu Muis 2017-05-23 12:32:02

en général, une nouvelle clé et une IV doivent être créées pour chaque session, et ni la clé ni la IV ne doivent être stockées pour être utilisées lors d'une session ultérieure.

pour communiquer une clé symétrique et IV à une partie distante, vous cryptez habituellement la clé symétrique et IV en utilisant le cryptage asymétrique. Envoyer ces valeurs à travers un réseau non sécurisé sans les Crypter est extrêmement dangereux, car quiconque intercepte ces valeurs peut alors décrypter vos données. Pour plus d'informations sur ce processus de chiffrement et de transfert de la clé et IV, voir création d'un schéma cryptographique .

4
répondu apros 2011-02-11 09:35:08

lorsque vous installez l'application, faites un nouvel ensemble de clés RSA, puis chiffrez les données avec AES en utilisant la clé privée comme mot de passe. Comme Windows stocke les clés privées RSA en toute sécurité sur le PC qui les a créées, les données ne peuvent être déchiffrées par l'ordinateur que créé les données parce que seul cet ordinateur aura la clé nécessaire.

3
répondu DividedByZero 2017-10-17 17:25:42

qu'en est-il du stockage de la clé de chiffrement/déchiffrement de fichier sur un serveur distant, en l'obtenant par un service web qui le transférerait par https à l'application? de cette façon, la clé reste dans la mémoire de l'ordinateur mais n'est pas dans un fichier de code source.

Cela nécessite d'avoir une connexion avec le serveur de clés par celui qui exécute l'application.

1
répondu user1892410 2013-08-22 21:36:51

qu'en est-il du stockage de la clé sur un matériel, je parle ici des Modules de sécurité Matériel! Pouvons-nous l'utiliser comme pratique exemplaire pour cacher la clé? Peut-on stocker la clé dans le fichier de configuration puis crypter le fichier de configuration ? Dans mon cas, je parle d'une Application autonome .Net.

0
répondu iamjayp 2017-07-07 13:10:43