2008-09-02 20 views
31

J'ai un code comme celui-ci dans une application winforms que j'écrivais pour interroger le quota de stockage d'une boîte aux lettres d'un utilisateur.Comment stocker les mots de passe dans l'application Winforms?

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

Peu importe quelle approche j'ai essayé (comme SecureString), je suis facilement en mesure de voir le mot de passe (m_pwd) soit en utilisant des chaînes réflecteur ou en utilisant l'onglet de Process Explorer pour l'exécutable.

Je sais que je pourrais mettre ce code sur le serveur ou renforcer la sécurité en utilisant des mécanismes comme la délégation et en ne donnant que les privilèges requis au compte de service. Est-ce que quelqu'un peut suggérer un moyen raisonnablement sécurisé de stocker le mot de passe dans l'application locale sans révéler le mot de passe aux pirates?

Le hachage n'est pas possible car j'ai besoin de connaître le mot de passe exact (pas seulement le hachage à des fins de correspondance). Les mécanismes de cryptage/décryptage ne fonctionnent pas car ils dépendent de la machine.

Répondre

24

la méthode sanctifiée est d'utiliser CryptoAPI et les API de protection des données

pour chiffrer, utiliser quelque chose comme ça (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; 

Decryption 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 crypté peut être stocké en toute sécurité dans le fichier de registre ou config et vous seul pouvez déchiffrer. Si vous spécifiez LOCAL_MACHINE, toute personne ayant accès à la machine peut l'obtenir.

2

Si vous le stockez comme une chaîne sécurisée et enregistrez la chaîne sécurisée dans un fichier (en utilisant éventuellement Isolated Storage, la seule fois où vous aurez un mot de passe en texte brut, c'est lorsque vous le déchiffrez pour créer votre mbstore. ne pas prendre un SecureString ou d'un objet Credential

4

J'ai trouvé ce livre par Keith Brown Le Guide du développeur de .NET pour Windows Security. Il a quelques bons échantillons couvrant toutes sortes de scénarios de sécurité. Free Online version est également disponible.

11

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 cadre encapsule les appels avec la classe System.Security.Cryptography.ProtectedData.

+1

Existe-t-il un exemple sur le web pour savoir comment cela est fait? – karlipoppins

+1

@m_oLogin: Voir l'une de mes autres réponses [ici] (http://stackoverflow.com/questions/154430/persistent-storage-of-encrypted-data-using-net/154687#154687) –