Question

J'ai un code comme celui-ci dans une application Winforms que j'écrivais pour interroger le quota de stockage de la boîte aux lettres d'un utilisateur.

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

Quelle que soit l'approche que j'ai essayée (comme SecureString), je peux facilement voir le mot de passe (m_pwd) soit en utilisant Reflector, soit en utilisant l'onglet chaînes 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 tels que la délégation et en accordant uniquement les privilèges requis au compte de service.

Quelqu'un peut-il 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échiffrement ne fonctionnent pas car ils dépendent de la machine.

Était-ce utile?

La solution

La méthode consacré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écryptage est l'inverse :

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 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.

Autres conseils

Comme mentionné, l'API de protection des données est un bon moyen d'y parvenir.Notez que si vous utilisez .NET 2.0 ou version ultérieure, vous n'avez pas besoin d'utiliser P/Invoke pour appeler le DPAPI.Le framework encapsule les appels avec la classe System.Security.Cryptography.ProtectedData.

J'ai trouvé ce livre de Keith Brown, le Guide du développeur .NET sur la sécurité Windows.Il contient de bons exemples couvrant toutes sortes de scénarios de sécurité.Gratuit Version en ligne est également disponible.

Si vous le stockez sous forme de chaîne sécurisée et enregistrez la chaîne sécurisée dans un fichier (éventuellement en utilisant Stockage isolé, 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.Malheureusement, le constructeur ne prend pas d'objet SecureString ou Credential.

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