加密连接字符串,以便其他开发人员无法解密,但应用程序仍然可以访问

时间:2009-06-01 19:09:00

标签: .net encryption connection-string

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

虽然我可以通过拒绝用户帐户访问权限来锁定数据库,但是对于网络应用程序来说,拥有众所周知的密钥并没有帮助。任何人都知道允许Web应用程序访问数据库的好方法,而不会让精明的开发人员使用Web应用程序使用的SQL帐户吗?

6 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

你可能会以错误的方式看待它。

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

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

不言而喻(至少它应该)你应该有一个单独的数据库,它具有不同的开发/质量保证认证。

答案 3 :(得分:1)

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

或者你可以聘请非精明的开发人员。 :)

答案 4 :(得分:1)

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

为什么人们可能想要加密配置文件的值有很多原因。例如确保盒子如果受到损害则不会危及数据库服务器盒。

如果该数据库不是sql server之类的东西,例如oracle或sybase,那么上面的解决方案就无法工作。

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

答案 5 :(得分:0)

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

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

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