关于安全性:如何在Winforms应用程序中存储密码?

关于安全性:如何在Winforms应用程序中存储密码?

How to store passwords in Winforms application?

我在一个winforms应用程序中编写了这样的代码,用来查询用户的邮箱存储配额。

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

无论我尝试什么方法(如SecureString),我都可以很容易地看到密码(m_pwd),无论是使用reflector还是使用process explorer的strings选项卡作为可执行文件。

我知道我可以将此代码放在服务器上,或者使用诸如委派之类的机制加强安全性,并且只给服务帐户所需的特权。

有人能在不向黑客透露密码的情况下,建议一种合理安全的方法在本地应用程序中存储密码吗?

散列是不可能的,因为我需要知道确切的密码(不只是为了匹配目的的散列)。加密/解密机制不起作用,因为它们依赖于计算机。


认证方法是使用CryptoAPI和数据保护API。

要加密,使用像这样的东西(C++):

1
2
3
4
5
6
7
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;

解密是相反的:

1
2
3
4
5
6
7
8
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本地计算机,那么加密的密码可以安全地存储在注册表或配置文件中,只有您可以对其进行解密。如果您指定了本地机器,那么任何有权访问该机器的人都可以得到它。


如前所述,数据保护API是一种很好的方法。请注意,如果您使用的是.NET 2.0或更高版本,则不需要使用p/invoke来调用dpapi。框架使用System.Security.Cryptography.ProtectedData类包装调用。


我找到了这本书,作者是KeithBrown,.NET开发人员的Windows安全指南。它有一些很好的示例,涵盖了各种安全场景。还提供免费的在线版本。


如果您将其存储为安全字符串并将安全字符串保存到文件(可能使用独立存储),那么只有在您解密它以创建mbstore时才会有纯文本密码。不幸的是,构造函数不接受SecureString或凭据对象。


推荐阅读

    linux打命令输入密码?

    linux打命令输入密码?,密码,系统,状态,代码,管理,标的,位置,地址,名称,命令,L

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux登陆用户命令?

    linux登陆用户命令?,系统,工具,信息,地址,软件,工作,命令,数字,服务,名称,Lin

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux查询分辨率命令?

    linux查询分辨率命令?,情况,设备,系统,分辨率,数据,命令,屏幕,屏幕分辨率,

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux命令查询汉语?

    linux命令查询汉语?,工作,地址,系统,信息,命令,目录,标准,状态,软件,亚洲,基

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户管理的命令?

    linux用户管理的命令?,系统,管理,信息,地址,工作,用户,单位,基础,数据,命令,L

    linux命令行更新密码?

    linux命令行更新密码?,密码,系统,名称,软件,信息,环境,命令,使用者,权限,用

    linux登录改密码命令?

    linux登录改密码命令?,密码,系统,名称,软件,状态,服务,信息,策略,环境,命令,

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux下查询历史命令?

    linux下查询历史命令?,地址,信息,系统,服务,数据,连续,命令,数字,名称,环境,l

    linux查询表结构命令?

    linux查询表结构命令?,系统,标准,信息,数据,地址,设备,时间,适当,软件,命令,l

    删除密码命令linux?

    删除密码命令linux?,密码,系统,管理,电脑,软件,百度,信息,名称,名字,命令,lin

    linux网络命令查询?

    linux网络命令查询?,信息,网络,系统,地址,工作,状态,技术,电脑,命令,设备,lin

    linux查询子目录命令?

    linux查询子目录命令?,信息,系统,命令,名称,文件,名字,管理,软件,灵活,工具,L

    linux串口命令行密码?

    linux串口命令行密码?,密码,系统,状态,信息,标的,地址,用户名,终端,用户,命

    linux查询状态的命令?

    linux查询状态的命令?,系统,状态,信息,管理,数据,情况,命令,综合,电脑,工具,l