1

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

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

4

6 回答 6

5

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

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

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

您还应该将应用程序帐户在数据库上可以做的事情限制在它需要的最低限度(没有管理员/dbo)。

于 2009-06-01T19:20:06.760 回答
3

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

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

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

于 2009-06-01T19:13:50.910 回答
2

您可能以错误的方式看待这个问题。

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

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

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

于 2009-06-01T19:25:55.330 回答
1

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

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

于 2009-06-01T19:21:32.873 回答
1

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

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

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

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

于 2010-09-22T09:58:27.257 回答
0

如果你真的相信你的开发人员在这个问题中提出了严重的安全风险,你应该立即解雇他们并雇佣你最终可以信任的开发人员。

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

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

于 2009-06-01T19:21:26.713 回答