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

时间:2008-08-08 16:32:30

标签: .net sql-server connection-string

我的团队正在开发的应用程序有一个DLL,用于执行所有数据库访问。应用程序无法使用受信任的连接,因为数据库位于防火墙后面而域服务器不在。因此,连接字符串似乎需要具有DB用户名和密码。 DLL当前具有硬编码的数据库连接字符串,但我不希望在启动时执行此操作,因为可以反汇编程序集,并且用户名和密码将在打开时正确。

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

有没有办法存储加密的密码,我们可以轻松地分发给整个用户群而不将其存储在程序集中?

更新:感谢所有回答的人。我将尝试回答一些问题...... ASP.NET WebForms和VB.NET WinForms都使用了数据DLL。我知道应用程序可以拥有自己的配置文件,但我还没有看到任何关于DLL的配置文件。不幸的是,我无法在工作中看到Jon Galloway的帖子,所以我无法判断这是否有效。从开发的角度来看,我们不希望在内部使用Web服务,但可能会在明年的某个时候将它们提供给第三方。我不认为模拟会起作用,因为我们无法通过防火墙对用户进行身份验证。由于用户(或以前的用户)可能是攻击者,我们会将其保留给所有人!

8 个答案:

答案 0 :(得分:9)

我不确定,但我相信你可以将它放在配置文件中并加密配置文件。

更新:请参阅Jon Galloway的帖子here.

答案 1 :(得分:3)

假设坏人将从您的配置文件中获取凭据。这意味着他们可以登录到您的数据库并执行用户能够执行的任何操作。因此,只需确保用户不能做任何不好的事情,比如直接访问表格。使该用户只能执行某些存储过程,您将处于更好的状态。这是一个发光的地方。

答案 2 :(得分:1)

我讨厌这样说但是只要你在客户端机器上放了一些东西,那些数据的安全就会消失。

如果您的程序要解密该字符串,您需要假设攻击者可以执行相同的操作。将调试器附加到您的程序将是一种方式。

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

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

答案 3 :(得分: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>

答案 4 :(得分:0)

有几个选择:

  1. 存储在web.config中并加密
  2. 以dll存储并混淆(dotfuscator)
  3. 在web.config中存储一个(当然是加密的)并在数据库中休息(如果你必须使用多个并且加密/解密变得很痛苦)

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您希望能够在所有设置信息位于可配置位置的情况下分发DLL,但事实上,除非您执行某些操作,否则您不能拥有一个方便的Dandy .NET配置文件定制

也许你需要重新考虑你的DLL应该具备的责任。要求连接字符串是否由库用户传入是否可能或有意义?你的DLL读取配置文件真的有意义吗?

答案 7 :(得分:0)

如果该应用是ASP.NET应用,那么只需加密web.config的连接字符串部分。

如果应用程序是在多台计算机上运行的客户端应用程序,而不是在本地存储连接字符串,请考虑使用Web服务或其他某种安全机制来集中存储它。这将有助于将来更容易的更新,并且您不会在本地存储连接字符串。

只是一些想法。

已更新: @ lassevk

“将连接字符串存储在服务器上,并通过网络连接获取它听起来不错,直到您意识到您还需要该网络连接的安全性,否则攻击者也可以冒充您的程序和与网络连接交谈。“

Web服务的安全性是隐含的。根据部署类型,有许多选项......例如客户端证书。