2008-09-02 47 views
31

我在写一个用于查询用户的邮箱存储配额的Winforms应用程序中有这样的代码。如何在Winforms应用程序中存储密码?

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

无论我尝试何种方法(如SecureString),我很容易就能看到密码(m_pwd)Process Explorer中的可执行的或者使用反射镜或使用字符串标签。

我知道我可以把这个代码放在服务器上,或者使用像委托这样的机制来加强安全性,并且只给服务帐户提供所需的权限。

有人可以建议一个合理安全的方式来存储在本地应用程序的密码,而不向黑客透露密码?

散列是不可能的,因为我需要知道确切的密码(不仅仅是用于匹配目的的散列)。 加密/解密机制不起作用,因为它们与机器相关。

回答

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; 

解密是相反:

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,那么任何有权访问机器的人都可以获得它。

2

如果将它作为安全字符串存储并将安全字符串保存到文件(可能使用Isolated Storage,那么只有当您解密密码才能创建mbstore时,您将获得纯文本密码。不采取SecureString的或Credential对象

4

我发现这本书是由基于Windows安全的.NET开发人员指南。它有一些很好的样本涵盖了各种安全场景。 免费Online version也可用。

11

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

+1

在网络上是否有一个例子来说明这是如何完成的? – karlipoppins 2010-06-30 14:58:43

相关问题