Dans notre application, nous avons beaucoup de paramètres de configuration sensibles, que nous stockons dans un fichier XML qui est à nouveau chiffré.
Ce fichier sécurisé doit être déchiffré au moment de l'exécution et les valeurs de configuration doivent être lues. mais le problème est que la clé et le vecteur d’initialisation sont codés en dur dans le code et que tout le monde peut les lire à l’aide de Reflector.
Quel est le meilleur moyen de stocker des clés de cryptage dans .NET afin que personne ne puisse les lire à l’aide de Reflector?
Si vous souhaitez protéger vos données des autres utilisateurs. Jetez un coup d'œil à la classe ProtectedData .
(Avertissement: Protéger vos données pour créer un système de protection contre la copie n'est pas traité dans cette réponse).
Cette classe utilise l’indicateur DPAPI de Windows pour chiffrer et déchiffrer les données au niveau utilisateur ou machine.
L'utilisation de ProtectedData/DPAPI vous libère du traitement des clés et de la sécurisation des données vous-même. Et vous pouvez choisir de protéger les données pour l'utilisateur actuel. Les données peuvent être lues sur différents ordinateurs par les mêmes utilisateurs du domaine.
Si vous voulez créer votre propre clé. Vous pouvez créer une clé par utilisateur/ordinateur et stocker cette clé dans le registre. Le registre pouvant être sécurisé, seul l'utilisateur actuel peut relire la clé. Je sais que le registre a un mauvais karma, mais est en fait très bon pour stocker des données comme celle-ci.
PS: Ne mettez pas l'IV dans votre code. Créez un nouveau IV à chaque fois et placez-le devant les données.
Si vous ne pouvez pas les lire dans le réflecteur, comment voulez-vous que le programme les lise? Vous pouvez les masquer en les séparant et en stockant les parties un peu partout, mais une fois que vous avez besoin de votre programme pour pouvoir les lire, toute personne ayant accès à votre code peut également les lire.
N'oubliez pas que les valeurs en mémoire sont également accessibles ( toux SecureString).
Vous devez utiliser le magasin de clés de la machine, il s'agit d'un stockage sécurisé spécialement conçu à cet effet. 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 pouvant être utilisée pour récupérer la clé ultérieurement.
Pour plus d'exemples, consultez cette question: Comment stocker une clé publique dans un conteneur de clés RSA au niveau de l'ordinateur
En règle générale, une nouvelle clé et un nouveau vecteur d'initialisation doivent être créés pour chaque session. Ni la clé ni le système d'initialisation ne doivent être stockés pour une utilisation ultérieure.
Pour communiquer une clé symétrique et un vecteur virtuel à une partie distante, vous devez généralement chiffrer la clé symétrique et le système virtuel à l'aide d'un chiffrement asymétrique. L'envoi de ces valeurs sur un réseau non sécurisé sans les chiffrer est extrêmement dangereux, car toute personne qui intercepte ces valeurs peut alors déchiffrer vos données. Pour plus d'informations sur ce processus de chiffrement et de transfert de la clé et du vecteur IV, voir Création d'un schéma cryptographique .
Lorsque vous installez l'application, créez un nouveau jeu de clés RSA, puis chiffrez les données avec AES en utilisant la clé privée comme mot de passe. Étant donné que Windows stocke les clés privées RSA de manière sécurisée sur le PC qui les a créées, les données ne peuvent être déchiffrées que par l’ordinateur qui a créé les données car seul cet ordinateur aura la clé nécessaire.
Qu'en est-il de stocker la clé de chiffrement/déchiffrement de fichier sur un serveur distant, via un service Web capable de la transférer via https à l'application? De cette façon, la clé reste dans la mémoire de l'ordinateur mais ne se trouve pas dans un fichier de code source.
Cela nécessite d’être connecté au serveur de clés par celui qui exécute l’application.
Pourquoi ne pas stocker la clé sur un matériel? Ici, je parle de modules de sécurité du matériel! Pouvons-nous l'utiliser comme meilleures pratiques pour cacher la clé? Peut-on stocker la clé dans le fichier de configuration, puis chiffrer le fichier de configuration? Dans mon cas, je parle d'une application .Net autonome.