2008-09-02 69 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

相關問題