c# - 加密 ASP.NET 连接字符串的正确方法是什么?

标签 c# asp.net encryption connection-string

我一直在查看在 ASP.NET MVC 应用程序 (.NET 4.0) 中加密 connectionStrings (Web.config) 的几个示例,似乎有两种通用方法可以实现它(example 1 和相关的example 2 ):

使用 aspnet_regiis 工具。

使用 aspnet_regiis 的主要问题是我可以在本地(在我的开发机器上)运行该工具,但该网站实际上托管在 Arvixe 上并且与任何其他 Web 主机一样:无法在服务器上运行命令。据我了解,如果我在我的机器上加密 Web.config connectionStrings 并发布 Web.config,那么它们将无法在服务器上解密(如果这是错误的,请纠正我)。

注意:我只使用了 RSAProtectedConfigurationProvider,但我认为 DataProtectionConfigurationProvider 也会有同样的问题,因为它是特定于用户/机器的。

以编程方式加密连接字符串。

以编程方式加密 connectionStrings 也有一个缺点:每次我发布我的网站时,Web.config 都会更新(使用未加密的 connectionStrings),这意味着在一段时间内 Web.config 不会被加密。即使我确保 Web.config 仅在有更改时发布,问题可能会最小化但不会缓解。

我认为使用静态类可能会进一步帮助减少未加密 connectionString 的时间。不幸的是,加密 connectionStrings 需要应用程序路径,似乎获取应用程序路径的唯一方法是来自请求 (Request.ApplicationPath),而在静态类中(显然)没有请求。

private void ProtectSection(string sectionName,
                                   string provider)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
                 config.GetSection(sectionName);

    if (section != null &&
              !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(provider);
        config.Save();
    }
}

private void UnProtectSection(string sectionName)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
              config.GetSection(sectionName);

    if (section != null &&
          section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        config.Save();
    }
}

UnProtectSection("appSettings");

ProtectSection("appSettings",
    "DataProtectionConfigurationProvider");

加密 connectionString 并消除/减少 Web.config 部分未加密的时间的正确方法是什么?您是否围绕 OpenWebConfiguration 方法编写了某种类型的包装器来检查该部分是否已加密并仅使用该包装器?用户可能会访问您网站上的任何页面,那么您如何延迟加密直到他们从数据库中请求一些数据,或者您是否会在第一时间检查它是否已加密?

最佳答案

共享主机最简单的方法可能是编写您自己的加密/解密实用程序并将连接字符串存储在应用程序设置、自定义 XML 文件或文本文件中,以便您可以完全控制加密/解密过程...

根据您的更新,您可以通过以下方式获取当前请求:

new HttpRequestWrapper(System.Web.HttpContext.Current.Request);

HTH。

关于c# - 加密 ASP.NET 连接字符串的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5073443/

相关文章:

c# - 抽象工厂模式——具体工厂的要点

asp.net - 在 Windows Server 2008 上的 ASP.NET 中使用 Microsoft.Ink

asp.net - 不支持关键字 : 'provider'

ssl - 如何使用 OpenSSL 将我们创建的 session 加密算法添加到(主要)浏览器

Java 密码和 php mcrypt_encrypt(带 ECB 填充的 BLOWFISH 算法)

c# - 将 TimeSpan 格式化为倒数计时器的正确方法是什么?

c# - 有一组任务,一次只运行 X

c# - 在 ASP.NET Web API2 webservice 中实现 OAuth 访问 token

asp.net - Ajax请求必须返回最新博客文章列表,json还是xml?

java - 使用 JNA 解密使用 MS DPAPI 加密的数据