32 votes

Comment stocker les mots de passe dans l'application Winforms?

J'ai un code comme cela dans une application winforms j'ai écrit à la requête d'un utilisateur de messagerie de la boîte de Quota de Stockage.

DirectoryEntry mbstore = new DirectoryEntry(
      @"LDAP://" + strhome, 
      m_serviceaccount, 
      [m_pwd], 
      AuthenticationTypes.Secure);

Peu importe ce que l'approche que j'ai essayé (comme SecureString- )), je suis facilement en mesure de voir le mot de passe (m_pwd) soit à l'aide d'un Réflecteur ou à l'aide de cordes de l'onglet Explorateur de Processus pour l'exécutable.

Je sais que je pourrait mettre ce code sur le serveur ou de renforcer la sécurité à l'aide de mécanismes comme la délégation et donnant seulement les privilèges requis pour le compte de service.

Quelqu'un peut-il suggérer un raisonnablement sûr moyen de stocker le mot de passe dans l'application locale sans révéler le mot de passe pour les pirates?

Le hachage n'est pas possible car j'ai besoin de connaître le mot de passe exact (et pas seulement de la valeur de hachage pour la mise en correspondance but). Le cryptage/Décryptage des mécanismes ne sont pas de travail car ils sont dépend de la machine.

27voto

1800 INFORMATION Points 55907

La méthode sanctifiée consiste à utiliser CryptoAPI et les API de protection des données.

Pour chiffrer, utilisez quelque chose comme ceci (C ++):

 DATA_BLOB blobIn, blobOut;
blobIn.pbData=(BYTE*)data;
blobIn.cbData=wcslen(data)*sizeof(WCHAR);

CryptProtectData(&blobIn, description, NULL, NULL, NULL, CRYPTPROTECT_LOCAL_MACHINE | CRYPTPROTECT_UI_FORBIDDEN, &blobOut);
_encrypted=blobOut.pbData;
_length=blobOut.cbData;
 

Le déchiffrement est le contraire:

 DATA_BLOB blobIn, blobOut;
blobIn.pbData=const_cast<BYTE*>(data);
blobIn.cbData=length;

CryptUnprotectData(&blobIn, NULL, NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &blobOut);

std::wstring _decrypted;
_decrypted.assign((LPCWSTR)blobOut.pbData,(LPCWSTR)blobOut.pbData+blobOut.cbData/sizeof(WCHAR));
 

Si vous ne spécifiez pas CRYPTPROTECT_LOCAL_MACHINE, le mot de passe chiffré peut être stocké en toute sécurité dans le registre ou le fichier de configuration et vous seul pouvez le déchiffrer. Si vous spécifiez LOCAL_MACHINE, toute personne ayant accès à la machine peut l'obtenir.

13voto

Michael Petrotta Points 35647

Comme mentionné, l'API Data Protection est un bon moyen de le faire. Notez que si vous utilisez .NET 2.0 ou supérieur, vous n'avez pas besoin d'utiliser P / Invoke pour appeler DPAPI. Le framework encapsule les appels avec la classe System.Security.Cryptography.ProtectedData.

4voto

Gulzar Nazim Points 35342

J'ai trouvé ce livre par Keith Brown Le Guide du développeur .NET pour la sécurité de Windows. Il contient de bons exemples couvrant toutes sortes de scénarios de sécurité. La version gratuite en ligne est également disponible.

2voto

Steven Murawski Points 6665

Si vous le stockez en tant que chaîne sécurisée et enregistrez la chaîne sécurisée dans un fichier (éventuellement en utilisant le stockage isolé , la seule fois où vous aurez un mot de passe en texte brut est lorsque vous le déchiffrez pour créer votre mbstore. Malheureusement, le constructeur ne prend pas de SecureString ou un objet Credential.

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