在app.config文件中,真的可以保护连接字符串吗?

7
我们希望保护用于连接到我们的SQL Server数据库的登录信息,以防止.NET Windows应用程序被攻击。

此信息存储为客户端PC上的app.config文件中的连接字符串。

几乎在任何地方都建议使用以下方法加密连接字符串:

(ConnectionStringsSection)config.GetSection("connectionStrings").ProtectSection();

然而,一个想要获取你的数据库密码的恶意用户可以仅仅复制加密的配置文件,将其用于自己的应用程序,并进行调用。
(ConnectionStringsSection)config.GetSection("connectionStrings").UnprotectSection();

这将把连接字符串解密回明文。

有没有办法在存储在用户 PC 上的 .NET 应用程序中真正保护数据库密码?

编辑: 进一步澄清情况,我们确实是在谈论一个恶意用户(参见:竞争对手),该用户可以访问相同的PC并想要密码。

作为第二措施,我们首先加密密码,保存到 app.config 中,然后调用 ProtectSection()。这将使 Unprotect() 输出加密的密码。但是,用户仍然可以反编译我们的代码,找出我们使用的加密密钥和算法...


3
那基本上是不可能的。 - SLaks
2
但是那个恶意用户必须在加密此部分的帐户下运行。如果情况非常糟糕,攻击者已经获得了该帐户的访问权限 - 你无能为力。另一方面,如果他只是窃取了这个文件 - 他将无法解密它。 - Evk
1
这就是为什么微软建议使用Windows身份验证而不是SQL登录的原因之一。 - Crowcoder
@Crowcoder 这并没有帮助,如果有人使用的不是 SQL Server。 - Bill Tür stands with Ukraine
1
请注意,如果竞争对手想要连接字符串,并且可以访问与您的程序相同的计算机,他们可以轻松地附加调试器,在 SqlConnection 构造函数内设置断点,然后从那里读取解密值。 - Scott Chamberlain
@ThomasSchremser 感谢您的提示。虽然我不知道他们的连接字符串是什么样子,但MySQL和Oracle也支持Windows身份验证。 - Crowcoder
2个回答

5

一个恶意用户想要获取你的数据库密码,可以复制加密配置文件,用它自己的应用程序使用。

除非这个恶意用户在同一台计算机上运行,或者拥有你的Protected Configuration Provider的加密密钥,否则这种方法是行不通的。

这种保护措施相当强大,但是如果我们假设 web.config 文件可能被盗,那么也必须假设私钥文件也可能会被盗。因此,受保护的选项只是在孩子们难以破解时才更加“安全”。

如果你的关系型数据库管理系统是 SQL Server,你可以使用其Integrated Security功能来避免存储甚至创建 RDBMS 的登录凭据。


但据我所记,问题中使用的选项将使用特定于当前用户而非当前机器的密钥进行加密。因此,恶意用户不仅需要能够访问相同的机器,还需要在与配置加密相同的用户下操作。 - Evk

1

所有的加密都使用一个密钥进行加密,你需要这个密钥才能解密。

ProtectSection文档显示它接受一个参数来指定加密方法。该文章提到了两种加密方法: DpapiProtectedConfigurationProviderRsaProtectedConfigurationProvider

Dpapi是机器特定或用户特定的(只能在同一台计算机上或由同一用户解密)。Rsa允许使用可在其他计算机上使用的共享密钥,但您必须实际拥有密钥才能解密。

因此,不能仅窃取.config文件并调用UnprotectSection(),然后期望它正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接