如何在Winforms应用程序中存储密码?
问题描述:
我在写一个用于查询用户的邮箱存储配额的Winforms应用程序中有这样的代码。如何在Winforms应用程序中存储密码?
DirectoryEntry mbstore = new DirectoryEntry(
@"LDAP://" + strhome,
m_serviceaccount,
[m_pwd],
AuthenticationTypes.Secure);
无论我尝试何种方法(如SecureString
),我很容易就能看到密码(m_pwd)Process Explorer中的可执行的或者使用反射镜或使用字符串标签。
我知道我可以把这个代码放在服务器上,或者使用像委托这样的机制来加强安全性,并且只给服务帐户提供所需的权限。
有人可以建议一个合理安全的方式来存储在本地应用程序的密码,而不向黑客透露密码?
散列是不可能的,因为我需要知道确切的密码(不仅仅是用于匹配目的的散列)。 加密/解密机制不起作用,因为它们与机器相关。
答
的圣方法是使用的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;
解密是相反:
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));
如果不指定CRYPTPROTECT_LOCAL_MACHINE则加密口令来安全地存储在注册表或配置文件,只有你才能解密。如果你指定LOCAL_MACHINE,那么任何有权访问机器的人都可以获得它。
答
如果将它作为安全字符串存储并将安全字符串保存到文件(可能使用Isolated Storage,那么只有当您解密密码才能创建mbstore时,您将获得纯文本密码。不采取SecureString的或Credential对象
答
如前所述,Data Protection API是一个很好的方法。请注意,如果您使用.NET 2.0或更高版本,则不需要使用P/Invoke来调用DPAPI。该框架使用System.Security.Cryptography.ProtectedData类包装调用。
在网络上是否有一个例子来说明这是如何完成的? – karlipoppins 2010-06-30 14:58:43