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

时间:2020-03-05 18:38:38  来源:igfitidea点击:

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

要求之一是每几个月需要更改一次密码,因此我们需要将其推广到我们的内部用户群。

有没有一种方法可以存储加密的密码,从而使我们可以轻松地将其分发给整个用户群,而无需将其存储在程序集中?

更新:感谢所有回答的人。我将尝试回答一些问题……ASP.NET WebForms和VB.NET WinForms都使用数据DLL。我知道应用程序可以有自己的配置文件,但是我没有在DLL的配置文件上看到任何内容。不幸的是,我无法上班的乔恩·加洛韦(Jon Galloway)职位,所以我无法判断是否可行。从开发的角度来看,我们不想在内部使用Web服务,但可能会在明年某个时候将其提供给第三方。我认为模拟不会起作用,因为我们无法通过防火墙对用户进行身份验证。由于用户(或者以前的用户)可能是攻击者,因此我们禁止所有人!

解决方案

回答

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

更新:请在此处查看Jon Galloway的帖子。

回答

如果该应用程序是ASP.NET应用程序,则只需对" web.config"的连接字符串部分进行加密。

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

只是一些想法。

更新:@lassevk

"将连接字符串存储在服务器上并通过Web连接获取它听起来不错,直到我们意识到也需要该Web连接上的安全性为止,否则攻击者可能同样会冒充程序并与Web连接进行对话。 "

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

回答

我讨厌这样说,但是一旦我们在客户端计算机上放了东西,该数据的安全性就会消失。

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

将连接字符串存储在服务器上并通过Web连接获取它听起来不错,直到我们意识到也需要该Web连接的安全性为止,否则攻击者可能同样会冒充程序并与Web连接进行对话。

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

回答

还有其他一些想法。我们可以始终使用模拟。另外,我们可以使用企业库的(公共库)。

<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>

回答

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

回答

我们希望能够在所有配置信息都位于可配置位置的情况下分发DLL,但事实是,除非我们执行自定义操作,否则我们将没有DLL的便捷的.NET配置文件之一。

也许我们需要重新考虑DLL应该承担的责任。要求图书馆用户传递连接字符串是否可行或者有意义?DLL读取配置文件真的有意义吗?

回答

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

回答

几种选择:

  • 存储在web.config中并加密
  • 存储在dll中并进行模糊处理(dotfuscator)
  • 将其中一个存储在web.config中(当然是加密的),然后存储在数据库中(如果我们必须使用多个,那么加密/解密就很麻烦了)