【问题标题】:Encrypting connection strings so other devs can't decrypt, but app still has access加密连接字符串以便其他开发人员无法解密,但应用程序仍然可以访问
【发布时间】:2010-10-30 11:48:18
【问题描述】:

我有一个想要通过 .NET Web 应用程序访问的数据库。我可以很容易地加密 web.config 中的连接字符串,但是任何有权访问该框的开发人员都可以使用几行代码对其进行解密 - 他们可以访问该框,因此可以访问存储在机器中的加密密钥。配置。

虽然我可以通过拒绝他们的用户帐户访问来将人们锁定在数据库之外,但网络应用程序拥有众所周知的王国钥匙并没有帮助。任何人都知道一种允许 Web 应用程序访问数据库的好方法,而无需精明的开发人员可以使用 Web 应用程序使用的 SQL 帐户?

【问题讨论】:

    标签: .net encryption connection-string


    【解决方案1】:

    这是一个先有鸡还是先有蛋的问题。如果您的应用程序可以访问密钥(加密连接字符串的密钥),那么任何与您的应用程序具有相同权限的人也都拥有它。

    管理此问题的最佳方法是根本没有秘密,并且不在 SQL Server 连接字符串中使用登录名/密码,而是使用集成安全性 (SSPI)。这样,您的应用程序将使用其 Windows 凭据(代表您的应用程序运行的帐户)对数据库进行身份验证,而无需在线发送任何凭据(常规身份验证意味着每次打开时都会在应用程序和 db 之间传递登录名/密码)连接),您不必存储任何密码。您只需要确保运行帐户的密码不容易被猜到。在那之后,您的安全性与帐户的安全性一样(这没什么好写的,但比在进程之间传递凭据要好得多)。

    请注意,使用相同凭据运行的任何内容(应用程序中的任何代码)也将使用服务帐户的权限运行。

    您还应该将应用程序帐户可以在数据库上执行的操作限制在它需要的最低限度(无管理员/dbo)。

    【讨论】:

    • 让我害怕的是,我加入的几乎每个项目都在使用 sa 帐户进行琐碎的数据库交互。更糟糕的是,界面中通常存在一些深奥的、过度设计的登录过程。
    【解决方案2】:

    如果我知道程序如何加密数据,并且我知道密钥在哪里,那么我就可以解密数据。 (“我”== 任何开发者)

    保护密钥(Unix 权限、Windows ACL)可能会阻止其中的大多数,但可以始终在程序中添加一行,将密钥(或仅未加密的数据)转储到秘密位置。 (或者将加密命令更改为看起来相似的命令,实际上是简单的 XOR 或等效命令......)

    总之,如果我能控制源代码,我可以让程序做任何事情。

    【讨论】:

      【解决方案3】:

      你可能看错了。

      在高度安全的情况下,开发人员(就像其他所有人一样)不应访问生产数据库。您可以使用防火墙或其他方式来实现这一点。

      如果您使用 Yann Schwartz 提到的 SSPI,则只有生产 Web 服务器可以访问数据库。如果这不可行,系统管理员应在部署时手动将(加密的)密码放入 web.config 文件中。

      不言而喻(或至少应该),您应该拥有一个单独的数据库,并为开发/QA 提供不同的身份验证。

      【讨论】:

        【解决方案4】:

        虽然我认为如果您不能信任您的开发人员,您可能会遇到一系列完全不同的问题,但您可能需要查看 aspnet_setreg 看看是否有帮助。

        或者您可以只雇用不精通的开发人员。 :)

        【讨论】:

          【解决方案5】:

          这里给出的答案并没有回答这个问题。

          想要加密配置文件的值的原因有很多。比如确保盒子如果被破坏不会破坏数据库服务器盒子。

          如果该数据库不是 sql server,例如 oracle 或 sybase,则上述解决方案将不起作用。

          Encrypting Web.Config Values in ASP.NET 2.0中有很多链接可以解决这个问题:

          【讨论】:

            【解决方案6】:

            如果您真的认为您的开发人员构成了您在此问题中提出的严重安全风险,您应该立即解雇他们并聘请您最终可以信任的开发人员。

            不能信任拥有数据库密钥的开发人员也不应该信任代码库。

            旁注是什么让他们远离 DEL * 。 * 在你的文件系统上?

            【讨论】:

            • HIPPA 只是您想要对谁获得密码进行硬性限制的一个例子。这有时是法律/责任问题,而不仅仅是信任问题。
            • @overslacked 这意味着生产系统和开发系统之间存在差异,在这种情况下很容易解决。 (不要让开发人员访问生产环境)
            • @Joseph ... 超级用户帐户经常在开发人员级别传递,并且对安全性的疏忽会在已发布的版本中冒泡。你对应该如何做是对的,我同意应该解雇不值得信任的人。然而,仅仅因为你可以信任某人并不意味着他们应该得到城堡的钥匙。
            • @overslacked 你是绝对正确的,但他的问题并没有说明不同的环境,所以我没有假设他指的是现场环境,我可能正确也可能不正确在。
            • 大多数开发人员无法同时访问开发和生产。政治在这些情况下扮演着重要的角色,我认为这在某种程度上是隐含的,但我应该在这一点上更加明目张胆。有了基于技术的解决方案(硬块),我可以更好地避免政治问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-25
            • 2020-06-25
            • 1970-01-01
            • 1970-01-01
            • 2019-11-07
            • 2023-03-17
            • 1970-01-01
            相关资源
            最近更新 更多