在.NET DLL中存储连接字符串的最佳方法是什么?

17

我团队目前正在开发的应用程序有一个DLL,用于执行所有数据库访问。由于数据库位于防火墙后面而域服务器不在防火墙内,因此应用程序无法使用可信连接。因此,连接字符串需要具有数据库用户名和密码。目前该DLL中已经硬编码了数据库连接字符串,但是在发布时我们不想这样做,因为程序集可以被反汇编,用户名和密码会被公开。

其中一个要求是每隔几个月需要更改一次密码,因此我们需要将其发布给我们的内部用户群体。

是否有一种加密存储密码的方法,可以轻松分发给全部用户,而不必将其存储在程序集中?

更新:感谢所有回答的人。我会尽力回答一些问题......数据DLL既用于ASP.NET WebForms也用于VB.NET WinForms。我知道应用程序可以拥有自己的配置文件,但是我没有看到关于DLL配置文件的任何内容。不幸的是,我不能在工作中访问Jon Galloway的帖子,所以我无法判断那是否有效。从开发角度来看,我们不想在公司使用Web服务,但可能会在明年向第三方提供。我认为模拟身份验证不起作用,因为我们无法通过防火墙对用户进行身份验证。由于用户(或以前的用户)可能是攻击者,我们将其保密。

8个回答

10

我不确定,但我认为你可以将它放入一个配置文件中并加密该配置文件。

更新:请参阅Jon Galloway的文章这里


更新不再指向任何东西,如果您能找到您所引用的信息并将其放入此答案中,则它将永久存在(或者直到Stack Overflow被太阳吞噬)。 - Jason Sperske
@JasonSperske - 我已更新链接。我很快会做个总结。 - Adam V

3

假设坏人已经从你的配置文件中获取了凭据。这意味着他们将能够登录到你的数据库并执行该用户所能执行的任何操作。因此,请确保该用户无法像直接访问表等那样执行任何恶意操作。使该用户只能执行某些存储过程,这样你就会处于更好的状态。这是存储过程发挥作用的一个地方。


我总是尽可能地限制 Web 应用程序的 SQL 登录方式。 - Matt Blaine

1

我不得不说,一旦你把东西放在客户机上,那些数据的安全性就会荡然无存。

如果你的程序要解密这个字符串,你需要假设攻击者也能做到。连接调试器到你的程序是其中一种方式。

将连接字符串存储在服务器上,并通过网络连接获取它听起来不错,但你需要在该网络连接上实现安全性,否则攻击者同样可以冒充你的程序并与网络连接通信。

让我问一个问题。你是想从谁隐藏连接字符串?用户还是攻击者?如果是用户,为什么?


0

还有一些其他的想法。你可以使用模拟身份。此外,你可以使用企业库(公共库)。

<section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<enterpriseLibrary.ConfigurationSource selectedSource="Common">
<sources>
  <add name="Common" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    filePath="Config\Exception.config" />
</sources>


0

几个选项:

  1. 存储在 web.config 中并加密
  2. 存储在 dll 中并混淆(dotfuscator)
  3. 将一个存储在 web.config 中(当然要加密),其余的存储在数据库中(如果您必须使用多个且加密/解密变得很麻烦)

0
如果应用程序是一个ASP.NET应用程序,那么只需加密web.config中的连接字符串部分。
如果应用程序是在多台计算机上运行的客户端应用程序,而不是本地存储连接字符串,考虑使用Web服务或其他一些安全机制将其集中存储。这将有助于以后更容易地进行更新,并且您不会在本地存储连接字符串。
以上仅为一些想法。
更新:@lassevk “将连接字符串存储在服务器上,并通过Web连接获取它听起来不错,直到你意识到你也需要在该Web连接上进行安全措施,否则攻击者可能会冒充你的程序并与Web连接通信。”
Web服务上的安全性是隐含的。根据部署类型,有许多选项……例如客户端证书。

0

.NET支持对配置值进行加密,您可以将其保留在配置文件中,但需要进行加密处理。


0

你希望能够将DLL与所有设置信息分发到可配置的位置,但事实是,除非你进行自定义操作,否则无法为DLL使用方便的.NET配置文件之一。

也许你需要重新考虑你的DLL应该承担什么责任。是否有可能或者说有意义要求库的用户通过传递连接字符串来完成?真的有必要让你的DLL读取配置文件吗?


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