【问题标题】:Protecting your Connection String on Shared Hosting保护共享主机上的连接字符串
【发布时间】:2017-05-17 21:16:37
【问题描述】:

我正在使用 MVC5 和 EF6 创建一个网站。我也使用共享主机来发布这个网站。现在我遇到的问题是我的连接字符串现在以纯文本形式位于 web.config 文件中。我很难找到关于如何处理这个问题的“直接”答案。

我看过很多文章,例如this one。这篇文章向我展示了如何加密我的 web.config 的连接部分。所以我尝试按照它的示例并加密它在该示例中显示的邮件部分。运行代码后,我注意到我的整个 web.config 文件都发生了变化。

原来是这样的:

<system.net>
  <mailSettings>
    <smtp from="info@Site.com">
      <network
        host="mail.Site.com"
        port="25"
        userName="info@site.com"
        password="password" />
    </smtp>
  </mailSettings>
</system.net>

现在是这样的:

<mailSettings>
  <smtp configProtectionProvider="RsaProtectedConfigurationProvider">
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
      xmlns="http://www.w3.org/2001/04/xmlenc#">
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
          <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
            <KeyName>Rsa Key</KeyName>
          </KeyInfo>
          <CipherData>
            <CipherValue>odapFFPDF1Fgsk2wyvbwVC4SNISqhWc9lXiAq+I/OW3wVVqBCPowxyen9M7c9+KUBkXmGSfaUVxDMlqutChv6g6VU8h4TWG3W6Tw/istjfw/UYrRsGguPiOqdvRsl9XLBmnS37v99+VX7FEA9TKb6ufC0a3Defp2MNpGTvTIR20=</CipherValue>
          </CipherData>
        </EncryptedKey>
      </KeyInfo>
      <CipherData>
        <CipherValue>lHPPFRJAH2hIm/Ya+ABRMP5mo5rEYwL2aBJQ/DT4Q+1OZXaftutiddxxJZ4LSgw3pzi1QJpU8eOPwFVebvqFVA4cjs27l8Iqz50E/R/tBfS7e2oqdWTRsc8IFfE/xOIieMp22BuFsYEDbgnIbLdbHJnw+92zyt2lUlzJpW9epNpnb29sVQhtNJ9cPjAaYAaU</CipherValue>
      </CipherData>
    </EncryptedData>
  </smtp>
</mailSettings>

我现在唯一的问题是如何在我的代码中读取这些值而无需解密和保存配置文件。我不想在每次需要阅读邮件设置部分甚至连接字符串部分时重写 webconfig 文件。

如果我有这样的方法:

public static string DecryptMailSettings()
{
    var config = WebConfigurationManager.OpenWebConfiguration("~");
    ConfigurationSection section = config.GetSection("system.net/mailSettings/smtp");
    if (section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        return section.???;
    }
    return "Nothing was read";
}

如何从上面的示例中获取让我们说“主机”的值。

【问题讨论】:

  • 您已选择加密您的整个邮件设置。似乎您只想加密用户名和密码。如果您无法从加密中解开主机名,也许您应该使用您的主机名添加一个简单的应用程序设置键值
  • @DaniDev 我在问如何从加密中解开主机名。
  • 我的建议是,如果加密/解密工作正常并且“解开”主机名似乎很麻烦,那么只需为您的 添加一个值。喜欢这个: ,然后在你的代码中阅读它

标签: c# asp.net encryption asp.net-mvc-5 web-config


【解决方案1】:

来自文档:

ASP.NET 在处理文件时会自动解密 Web.config 文件的内容。因此,不需要额外的步骤来解密加密的配置设置以供其他 ASP.NET 功能使用或访问代码中的值。

https://msdn.microsoft.com/en-us/library/dtkwfdky.aspx

【讨论】:

  • 所以换句话说,如果我想在启动时加密整个配置文件,并且每次网站尝试从中读取值时,它会在没有我的情况下自行解密必须添加任何额外的逻辑?
  • 您应该在部署之前对其进行加密。按照文档中的说明进行操作。
  • 它是共享主机,因此我无法运行 aspnet_regiis。出于这个原因,我希望在运行时使用代码执行此操作。话虽如此,我仍然需要能够读取主机名的值,这样我才能配置我的电子邮件服务。我怎么读那把钥匙?根据那篇文章,要读取该值,我仍然需要先对其进行解密。
  • 我托管了很多网站,但没有对 web.config 进行加密,并且从未遇到任何安全问题。这是因为该文件位于您的托管服务提供的所有保护之后。我个人不会太在意这个。
  • 如果您仍然坚持加密文件,如文章所述,ASP.NET 会自动解密,因此您无需执行任何操作。任何时候文件更改 ASP.NET 都会感知到它,并且无论如何都会重新加载它,所以你应该没问题。
【解决方案2】:

我的建议是,如果加密/解密工作正常,并且似乎“解开”主机名很麻烦,那么只需在 web.config 中添加一个值。

像这样: <appSettings> <add key="MAILHOST" value="mail.Site.com" /> , 然后在您的代码中阅读。

例如:

string HostName = ConfigurationManager.AppSettings["MAILHOST"].ToString();

【讨论】:

  • 主机名是我随机选择的,如果要查看密码怎么办?
  • 我想不出一个很好的理由来查看或“阅读”代码中的密码。如果您只想解密加密文件,则可以按照解密说明进行操作:msdn.microsoft.com/en-us/library/zhhddkxy.aspx
  • 此处提供的解密示例:msdn.microsoft.com/en-us/library/…
  • 再次,这是共享主机,我无法运行 aspnet_regiis。您的第二个示例显示了如何取消保护和保护,它没有显示取消保护后如何读取值。在我的问题中,我已经链接了显示如何执行第二个链接的文章,我的问题是在取消保护后如何实际读取该值。当我想访问数据时,我不希望它重写和重新保存配置文件。
  • 我相信我明白了。我在说/问的是:为什么要在加密后访问代码中的数据,假设您在那里有正确的值并且它正确连接到您的邮件服务器?如果要测试连接值,请使用未加密的 Web 配置执行此操作,然后在正确设置后对其进行加密。您可以在开发环境中保存未加密版本的配置文件以供参考。这是为了省去将解密程序内置到您的实时网站中的麻烦
猜你喜欢
  • 2017-05-22
  • 2015-11-03
  • 2010-09-09
  • 1970-01-01
  • 2013-08-30
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多