【问题标题】:What is the best way to store connection string in .NET DLLs?在 .NET DLL 中存储连接字符串的最佳方式是什么?
【发布时间】:2010-09-05 14:06:24
【问题描述】:

我的团队目前正在开发的应用程序有一个用于执行所有数据库访问的 DLL。应用程序无法使用受信任的连接,因为数据库位于防火墙后面,而域服务器不在。所以看起来连接字符串需要有一个数据库用户名和密码。 DLL 目前有硬编码的数据库连接字符串,但我不想在我们启动时这样做,因为程序集可以被反汇编,并且用户名和密码就在那里。

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

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

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

【问题讨论】:

    标签: .net sql-server connection-string


    【解决方案1】:

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

    更新:查看 Jon Galloway 的帖子 here.

    【讨论】:

    • 更新不再指向任何东西,如果您可以找到您引用的信息并将其放入此答案中,那么它将永远存在(或者只要 Stack Overflow 被太阳)
    • @JasonSperske - 我已经更新了链接。我很快就会总结一下。
    【解决方案2】:

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

    【讨论】:

    • 我总是尝试以尽可能多的方式限制我开发过的 Web 应用程序的 SQL 登录。
    【解决方案3】:

    我不想这么说,但是一旦您将某些内容放在客户端计算机上,该数据的安全性就会消失。

    如果您的程序要解密该字符串,您需要假设攻击者也可以这样做。将调试器附加到您的程序是一种方法。

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

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

    【讨论】:

      【解决方案4】:

      还有一些其他的想法。您始终可以使用模拟。也可以使用企业库的(Common Library)。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          您希望能够在所有设置信息都位于可配置位置的情况下分发 DLL,但事实是,除非您做某事,否则您无法拥有一个方便的 .NET 配置文件用于 DLL自定义。

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

          【讨论】:

            【解决方案7】:

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

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

            只是一些想法。

            更新: @lassevk

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

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

            【讨论】:

              【解决方案8】:

              几个选项:

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

              【讨论】:

                猜你喜欢
                • 2010-12-15
                • 1970-01-01
                • 2016-01-03
                • 2014-03-19
                • 2011-08-28
                • 1970-01-01
                • 2020-05-03
                • 2015-12-18
                • 2021-06-18
                相关资源
                最近更新 更多