Question

Je dois stocker des données chiffrées (quelques petites chaînes) entre les exécutions de l'application. Je ne veux pas que l'utilisateur fournisse une phrase secrète à chaque fois qu'il lance l'application. C'est à dire. après tout, il est essentiel de stocker en toute sécurité la ou les clés de chiffrement.

J'étais à la recherche de RSACryptoServiceProvider et de l'utilisation de PersistentKeyInCsp, mais je ne sais pas comment cela fonctionne. Le conteneur de clés est-il persistant entre les exécutions d'applications ou les redémarrages de la machine? Si oui, est-ce spécifique à l'utilisateur ou à la machine? C'est à dire. si je stocke mes données chiffrées dans le profil itinérant de l'utilisateur, puis-je déchiffrer les données si l'utilisateur se connecte sur un autre ordinateur?

Si ce qui précède ne fonctionne pas, quelles sont mes options (je dois gérer les profils itinérants).

Était-ce utile?

La solution

L’API de protection des données (DPAPI) fait exactement ce que vous voulez. Il fournit un cryptage symétrique de données arbitraires, en utilisant les informations d'identification de la machine ou (mieux) de l'utilisateur, en tant que clé de cryptage. Vous n'avez pas à vous soucier de la gestion des clés; Windows s'en occupe pour vous. Si l'utilisateur modifie son mot de passe, Windows chiffrera à nouveau les données à l'aide du nouveau mot de passe de l'utilisateur.

DPAPI est exposé dans .NET avec la classe System.Security.Cryptography.ProtectedData:

byte[] plaintextBytes = GetDataToProtect();
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser);

Le second paramètre de la méthode Protect est un tableau d'octets d'entropie facultatif, qui peut être utilisé en tant que "secret" supplémentaire spécifique à l'application..

Pour déchiffrer, utilisez l'appel ProtectedData.Unprotect:

byte[] encodedBytes = GetDataToUnprotect();
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser);

DPAPI fonctionne correctement avec les profils itinérants (comme décrit ici ), mais vous devrez stocker les données chiffrées dans un emplacement (partage réseau, IsolatedStorage avec IsolatedStorageScope .Roaming , etc.) auxquels vos différentes machines peuvent accéder.

Voir la classe ProtectedData dans MSDN pour plus d'informations. Il existe un livre blanc DPAPI, ici , avec plus d'informations que jamais. veux.

Autres conseils

Je voudrais ajouter à l'approche DPAPI.

Bien que je n'ai pas implémenté l'approche utilisateur par magasin, il existe une documentation Microsoft relative à cette approche qui chiffre et déchiffre les données d'un utilisateur spécifique.

J'ai utilisé le DPAPI à l'aide de la machine store. Je vais le décrire au cas où cela correspond à ce que vous cherchez à faire. J'ai utilisé un service Windows pour charger un profil utilisateur Windows et le mot de passe de cet utilisateur est utilisé pour chiffrer les données.

Par ailleurs, DPAPI utilise Triple-DES, qui peut être légèrement plus faible (qu’AES), mais je ne suis pas sûr du type de protection que vous recherchez.

Protection des données Windows http://msdn.microsoft.com/en-us/library/ms995355. aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top