使用Windows .NET或ASP.NET应用程序时,存储数据库密码的位置

我有一个困扰我多年的情景。 如果必须使用用户名和密码连接到数据库或其他服务(如Web服务),那么在通过.NET程序集连接时,哪里是存储此信息的最安全的位置? 我知道你必须加密密码,但是你遇到了一种鸡蛋问题 – 很好 – 你可以加密它,但是你把密钥放在哪里?

在.NET中,您无法对密码进行硬编码,因为您可以反编译.NET代码。

我查看了使用基于程序集的权限与隔离存储,但MS建议不要存储未加密的秘密项目,因为有资格的用户可以获得访问权限,所以我们再次将问题从A点移动到B点。所以对于例如,域管理员无需知道数据库中的信息就能够访问,因为能够成为域上任何工作站的管理员。

您可以加密App.Config和Web.Config,但我相信用户可以访问密钥。

我认为你遇到了与DPAPI相同的问题。

我曾考虑过存储密码,在远程数据库中加密并通过操作系统身份validation获取密码,但我们的部门禁止在数据库服务器上存储密码。 我很确定我被卡住并想要确认。

您不希望将密码存储在程序集中,重新发明轮子只会产生更多麻烦(并引入更多漏洞)而不是它的价值。 如果您在数据库和Web服务器上都使用MS平台,那么处理此问题的最简单方法是使用可信连接 ,并将SQL Server上的权限授予您的应用程序正在使用的标识。

其次,我会让DPAPI完成其工作来加密您的连接设置 。

您可以使用.NET Framework的以下方法来保护您的数据,它们在内部使用DPAPI来保护您的数据,您可以直接在C#或VB.NET中使用它们,而无需使用系统DLL调用:

namespace System.Security.Cryptography { // Summary: // Provides methods for protecting and unprotecting data. This class cannot // be inherited. public sealed class ProtectedData { public static byte[] Protect(byte[] userData, byte[] optionalEntropy, DataProtectionScope scope); public static byte[] Unprotect(byte[] encryptedData, byte[] optionalEntropy, DataProtectionScope scope); } } 

要使用它,请将参考System.Security添加到项目中。 我强烈建议使用字节数组optionalEntropy将SALT添加到受保护的数据中(向字节数组添加一些随机值,这些值对于您要保护的数据是唯一的)。

对于scope您可以使用DataProtectionScope.CurrentUser ,它将使用当前用户的凭据加密要保护的数据。

在某些情况下, DataProtectionScope.LocalMachine也很有用。 在这种情况下,受保护的数据与机器上下文相关联。 使用此设置,计算机上运行的任何进程都可以取消保护数据。 它通常用于在不允许不受信任的用户访问的服务器上运行的特定于服务器的应用程序中。

使用Protect方法加密数据,使用Unprotect对其进行解密。 您可以根据应用程序的要求(文件,数据库,注册表等)存储返回的字节数组。

有关这些方法的更多信息,请访问MSDN:

  • Windows数据保护 – 有关DPAPIfunction的一般信息,
  • 受保护的数据类 – ProtectedData类的规范,
  • 保护方法 – 有关Protect方法用法的说明

对于代码示例,如果您有兴趣加密应用程序.config文件的部分,请检查以下内容:

  • 在config中加密密码 – 文章解释了如何加密web / app.config的部分内容

我建议你使用SALT(即使用optionalEntropy参数) – 它可以防止彩虹表攻击。


我想提到的DPAPI解决方案有一个缺点:密钥是根据您的Windows凭据生成的,这意味着有权访问您的Windows凭据的人可能会访问受保护的数据。 在您的帐户下运行的程序也可以访问受保护的数据。

这是一个很好的问题,我一直在寻找答案。 我遇到的问题是如果服务器被黑客攻击并且可以检索单个文件,则保持数据库密码安全。 我发现的一个非常有趣的选项是web.config的各个部分可以通过.NET框架自动加密和解密,.NET框架将使用Windows安全存储来保存和检索加密密钥。 在我无法使用的情况下,因为我的托管服务提供商不支持它,但你可能会看看这个选项。 我认为它可能有效的原因是您可以独立管理用户可以访问Windows安全存储的安全性,并显着限制任何潜在的违规行为。 闯入服务器的黑客可能会获得配置文件和所有程序集的副本,但访问解密密钥对他来说是另一个障碍。

这里有几个选择。

  1. 将它们存储在加密的配置文件中
  2. 将它们存储在使用生成的种子加密的外部文件中。 模糊存储此基础种子的代码或将其存储在c ++ dll中(难以反编译)。