2008-09-30 6 views
15

J'ai besoin de stocker des données cryptées (quelques petites chaînes) entre les exécutions d'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 revient à stocker en toute sécurité les clés de chiffrement.Stockage persistant de données cryptées à l'aide de .Net

Je regardais RSACryptoServiceProvider et en utilisant PersistentKeyInCsp, mais je ne suis pas sûr comment cela fonctionne. Le conteneur de clés est-il persistant entre les exécutions de l'application ou les redémarrages de la machine? Si oui, est-ce spécifique à l'utilisateur ou spécifique à la machine? C'est à dire. Si je stocke mes données cryptées dans le profil itinérant de l'utilisateur, puis-je déchiffrer les données si l'utilisateur se connecte sur une machine différente?

Si ce qui précède ne fonctionne pas, quelles sont mes options (j'ai besoin de traiter les profils itinérants).

Répondre

35

L'API de protection des données (DPAPI) fait exactement ce que vous voulez. Il fournit un cryptage symétrique des données arbitraires, en utilisant les informations d'identification de la machine ou (mieux) l'utilisateur, en tant que clé de cryptage. Vous n'avez pas à vous soucier de gérer les clés; Windows prend soin de cela pour vous. Si l'utilisateur change son mot de passe, Windows rechiffre les données en utilisant le 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 en option, qui peut être utilisé comme une application supplémentaire -spécifique "secret".

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 here), bien que vous aurez besoin de stocker les données cryptées dans un lieu (partage réseau, IsolatedStorage avec IsolatedStorageScope.Roaming, etc.) que vos différentes machines peuvent accéder.

Consultez la classe ProtectedData dans MSDN pour plus d'informations. Il y a un livre blanc DPAPI here, avec plus d'informations que vous ne voudrez jamais.

+0

Juste pour la postérité, vous devrez regarder dans un autre code pour gérer la persistance quelque part plus « public » (au moins sur votre intranet par exemple) afin qu'ils puissent y accéder depuis autres machines. Normalement, vous pouvez utiliser Environment.SpecialFolder.ApplicationData pour obtenir un emplacement spécifique à la machine et à l'utilisateur. –

+0

Merci pour la réponse, cela devrait fonctionner. Avez-vous une idée de comment cela peut être fait dans 1.1.? ProtectedData est nouveau pour .Net 2.0 –

+1

Pour utiliser DPAPI dans .NET 1.1, vous devez utiliser P/Invoke.Voir ici pour une complète passation complète: http://msdn.microsoft.com/en-us/library/aa302402.aspx –

0

Je voudrais ajouter à l'approche DPAPI. Bien que je n'ai pas implémenté moi-même l'approche du magasin d'utilisateurs, il existe une documentation Microsoft pour une approche de magasin d'utilisateurs qui crypte et décrypte les données pour un utilisateur spécifique. J'ai utilisé le DPAPI en utilisant le magasin de la machine. Je vais le décrire au cas où cela correspondrait à ce que vous cherchez à faire. J'ai utilisé un service Windows pour charger un profil d'utilisateur Windows et le mot de passe de cet utilisateur est utilisé pour crypter des données.

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

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

Questions connexes