我的团队当前正在开发的应用程序有一个 DLL,用于执行所有数据库访问。应用程序无法使用可信连接,因为数据库位于防火墙后面,而域服务器则不然。所以看来连接字符串需要有数据库用户名和密码。DLL 当前对数据库连接字符串进行了硬编码,但我不想在启动时执行此操作,因为程序集可以被反汇编,并且用户名和密码将公开存在。

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

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

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

有帮助吗?

解决方案

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

更新:请参阅乔恩·加洛韦的帖子 这里。

其他提示

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

我不想这么说,但一旦你把一些东西放在客户端机器上,数据的安全性就消失了。

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

将连接字符串存储在服务器上并通过 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 读取配置文件真的有意义吗?

如果应用程序是 ASP.NET 应用程序,则只需加密您的应用程序的连接字符串部分 web.config.

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

只是一些想法。

更新: @拉塞夫克

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

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

几种选择:

  1. 存储在 web.config 中并加密
  2. 存储在 dll 中并进行混淆 (dotfuscator)
  3. 将一个存储在 web.config 中(当然是加密的)并保留在数据库中(如果您必须使用多个并且加密/解密变得很痛苦)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top