我们希望保护用于从.NET Windows应用程序连接到SQL Server数据库的登录信息。
此信息作为连接字符串存储在客户端PC上的app.config
文件中。
几乎在任何地方都建议您使用加密连接字符串
(ConnectionStringsSection)config.GetSection("connectionStrings").ProtectSection();
但是,想要您的数据库密码的恶意用户可以只复制加密的配置文件,将其与自己的应用程序一起使用,然后调用
(ConnectionStringsSection)config.GetSection("connectionStrings").UnprotectSection();
这会将连接字符串解密回纯文本。
有没有办法真正保护存储在用户PC上的.NET应用程序中的数据库密码?
编辑:为了进一步澄清情况,我们确实在谈论可以访问同一台PC并想要密码的恶意用户(阅读:竞争对手)。
作为次要措施,我们首先自己加密密码,将其保存到app.config
,然后调用ProtectSection()
。这将使Unprotect()
输出加密密码。但是用户仍然可以反编译我们的代码并找出我们使用的加密密钥和算法......
想要您的数据库密码的恶意用户可以只复制加密的配置文件,并将其与自己的应用程序一起使用
这不起作用,除非恶意用户在同一台计算机上运行,或者可以访问Protected Configuration Provider的加密密钥。
这是一个相当强大的保护,但如果我们假设web.config可能被盗,我们还必须假设私钥文件也可能被盗。因此,受保护的选项只有在隔壁的孩子更难以打破它的意义上才“更安全”。
如果您的RDBMS是SQL Server,则可以使用其Integrated Security功能来避免存储甚至创建RDBMS的登录凭据。
所有加密都使用密钥进行加密,您需要该密钥才能解密。
The documentation of ProtectSection
显示它需要一个指定加密方法的参数。该文章中提到了两个:DpapiProtectedConfigurationProvider
和RsaProtectedConfigurationProvider
。
Dpapi
是机器特定的或用户特定的(只能在同一台计算机上或由同一用户解密)。 Rsa
允许可以在其他计算机上使用的共享密钥,但您必须实际拥有密钥才能解密。
所以不,没有人可以窃取.config文件并调用UnprotectSection()
并期望它能够正常工作。