如何在Winforms应用程序中存储密码?

Gul*_*zim 31 security passwords winforms

我在winforms应用程序中有一些这样的代码我正在编写查询用户的邮箱存储配额.

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

无论我尝试什么方法(比如SecureString),我都可以轻松地使用Reflector或使用Process Explorer的字符串选项卡查看密码(m_pwd).

我知道我可以将此代码放在服务器上,或者使用委托等机制加强安全性,并仅为服务帐户提供所需的权限.

有人可以提出一种合理安全的方法来将密码存储在本地应用程序中而不向黑客透露密码吗?

哈希是不可能的,因为我需要知道确切的密码(不仅仅是用于匹配目的的哈希).加密/解密机制不起作用,因为它们取决于机器.

180*_*ION 24

成圣的方法是使用CryptoAPI和数据保护API.

要加密,请使用类似这样的东西(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;
Run Code Online (Sandbox Code Playgroud)

解密是相反的:

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));
Run Code Online (Sandbox Code Playgroud)

如果您未指定CRYPTPROTECT_LOCAL_MACHINE,则加密的密码可以安全地存储在注册表或配置文件中,只有您可以解密它.如果您指定LOCAL_MACHINE,那么任何有权访问该计算机的人都可以获得它.


Mic*_*tta 11

如前所述,Data Protection API是一种很好的方法.请注意,如果您使用的是.NET 2.0或更高版本,则无需使用P/Invoke来调用DPAPI.该框架使用System.Security.Cryptography.ProtectedData类包装调用.