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

我在联系的一个winforms应用程序中有一些类似的代码,询问个人是否是邮箱存储配额。

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

无论我尝试哪种方法(如 SecureString),我都可以方便地看到密码( m_pwd ) 使用 Reflector 或使用 Process Explorer 的字符串选项卡来获取可执行文件。

我知道我可能会将这段代码放在 Web 服务器上,或者使用委托等机制来加强安全性,并为服务帐户提供所需的优势。

有人可以推荐一种安全的方法来将密码存储在区域应用程序中,而不会向赛博朋克透露密码吗?

散列是不可能的,因为我需要识别特定的密码(不仅仅是匹配目标的散列)。 加密/解密系统无法正常工作,因为它们依赖于制造商。

32
2022-06-07 14:37:57
资源 分享
答案: 3

我找到了 keith Brown 的此出版物 The.NET Developer is Guide to Windows Security。 它有一些很好的例子,涵盖了各种安全环境。 额外提供免费的 网络版

5
2022-06-08 05:12:25
资源

如果您将其存储为安全字符串并将安全字符串保存到文件中(可能使用 隔离存储,那么您肯定会拥有纯文本密码的唯一时间是解密它以创建您的 mbstore。但是,构建器不采用 SecureString 或 Credential 对象。

2
2022-06-07 15:05:31
资源

神圣的方法是使用 CryptoAPI 以及数据保护 API。

要加密,请使用与此类似的东西(C+npls):

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,那么任何可以访问设备的人都可以得到它。

25
2022-06-07 15:05:22
资源