76 votes

La meilleure façon de stocker les clés de chiffrement dans .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é dans le runtime et les valeurs de configuration de la lecture. mais un problème se pose que la clé et le vecteur d'initialisation est codé en dur dans le code et donc n'importe qui peut le lire en utilisant un Réflecteur.

Quelle est la meilleure façon de stocker les clés de chiffrement dans .NET afin que personne ne puisse les lire à l'aide de Réflecteur?

27voto

GvS Points 28137

Si vous voulez protéger vos données des autres utilisateurs. Jetez un oeil à la ProtectedData classe.

(Avertissement: la Protection de vos données pour créer une copie du régime de protection n'est pas couvert dans cette réponse).

Cette classes utilise le DPAPI à partir de Windows, pour chiffrer et déchiffrer les données de l'utilisateur ou de la machine.

À l'aide de ProtectedData/DPAPI vous libère de la manipulation des touches 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. Parce que le registre peut être sécurisé, seul l'utilisateur actuel peut lire la touche retour. Je sais que le registre a un mauvais karma, mais est en fait très bon à stocker des données de ce genre.

PS: Ne mettez pas l'IV dans votre code. Créer un nouveau IV tous les temps, et de mettre en avant des données.

13voto

Muis Points 1827

Vous devez utiliser la Machine de magasin de clés, c'est un stockage sécurisé en particulier pour ce but. 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é pour récupérer la clé plus tard.

Pour plus d'exemples, voir à cette question: Comment faire pour stocker une clé publique à un niveau machine conteneur de clé RSA

10voto

Massif Points 2427

Si vous ne pouvez pas les lire dans le réflecteur, comment voulez-vous que le programme pour les lire? Vous pourrait obscurcir par les brisant et ranger les pièces dans tous les sens, mais (à ma connaissance) une fois que vous avez besoin de votre programme pour être en mesure 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).

4voto

apros Points 1941

Généralement, une nouvelle clé et IV doit être créé pour chaque session, et ni la clé, ni IV doit être stocké pour une utilisation dans une session ultérieure.

Pour communiquer une clé symétrique de la IV à une partie à distance, vous devez généralement chiffrer la clé symétrique et IV à l'aide de chiffrement asymétrique. L'envoi de ces valeurs à travers un réseau non sécurisé, sans les chiffrer, est extrêmement dangereux, car toute personne qui intercepte ces valeurs peuvent ensuite déchiffrer vos données. Pour plus d'informations sur ce processus de cryptage et de transfert de la clé et IV, voir Création d'un Schéma de Chiffrement.

4voto

Random User Points 715

Lorsque vous installez l'application d'un nouveau jeu de clés RSA, puis chiffrer les données avec AES à l'aide de la clé privée que le mot de passe. de cette façon, les données ne peuvent être déchiffrées par l'ordinateur qui a créé les données car la clé privée sera différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X