加密webconfig中的连接字符串,利用RSA非对称加密,利用windows保存密钥容器

演练:创建和导出 RSA 密钥容器

Visual Studio 2010
其他版本

更新:2007 年 11 月

提供从多台服务器上的一个加密文件创建、导出和导入加密密钥对已加密的 Web.config 文件的节进行解密的逐步骤示例。

由于您可以对存储在配置文件中的敏感信息进行加密,“受保护配置”有助于提高应用程序的安全性。在 .NET Framework 处理配置文件时,它会自动解密该文件,而且解密时不需要任何其他代码。可以使用 aspnet_regiis.exe 对配置文件的节进行加密并管理加密密钥。有关受保护的配置的更多信息,请参见使用受保护的配置加密配置信息

“受保护配置”使您能够创建、删除、导出和导入自定义的加密密钥以用于 RsaProtectedConfigurationProvider 提供程序。您可以创建加密密钥的备份副本或将加密密钥复制到多台 Web 服务器(如网络场),这样即可将包含已加密 Web.config 文件的应用程序复制到多个位置。

在本演练中,您将学会如何执行以下任务:

  • 创建自定义的 RSA 密钥容器。

  • 指定使用自定义 RSA 密钥容器的“受保护配置”提供程序。

  • 使用自定义 RSA 密钥容器对 Web.config 文件的节进行加密。

  • 将自定义的 RSA 密钥容器导出到 XML 文件。

  • 从 XML 文件导入自定义的 RSA 密钥容器。

若要完成本演练,您需要:

在本演练的这一部分中,您将通过使用带有 -pc 选项的 aspnet_regiis.exe 来创建 RSA 密钥容器。这将把 RSA 密钥容器标识为用户级别的密钥容器。必须将 RSA 密钥容器标识为用户级别(使用 -pku 选项)或计算机级别(不使用 -pku 选项)。有关计算机级别和用户级别的 RSA 密钥容器的更多信息,请参见了解计算机级别和用户级别的 RSA 密钥容器

创建计算机级的 RSA 密钥容器

  1. 打开命令提示。

    • 为此,在 Microsoft Windows 中单击“开始”,再单击“运行”,在“打开”框中键入“cmd”,然后单击“确定”。

  2. 在命令提示处,通过键入以下命令将目录更改为 .NET Framework 2.0 版目录:

    “cd \WINDOWS\Microsoft.Net\Framework\v2.0.*”

  3. 通过运行带有下列选项的 aspnet_regiis.exe 来创建计算机级别的新 RSA 密钥容器:

    • -pc 选项后跟 RSA 密钥容器的名称,用于创建 RSA 密钥对。

    • -exp 选项,用于确保密钥是可导出的。

    下面的命令将创建 "MyKeys" 密钥容器。

    aspnet_regiis -pc "MyKeys" -exp

    请勿关闭“命令提示”窗口。

ASP.NET 应用程序的标识必须能读取用于加密和解密已加密节的加密密钥,才能对 Web.config 文件中的已加密信息进行解密。

授予 ASP.NET 标识对 RSA 密钥容器的访问权限

  1. 打开文本编辑器,然后将下面的代码复制到一个新文件中。

     
    <%@ Page Language="VB" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
    %>
    
     
    <%@ Page Language="C#" %>
    <%
    Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
    %>
    
  2. 在应用程序目录中将该文件另存为 “identity.aspx”。

  3. 若要确定 ASP.NET 应用程序的标识,请在浏览器中打开 identity.aspx。

    浏览器中将出现 ASP.NET 应用程序的模拟标识。

    2w117ede.alert_note(zh-cn,VS.100).gif说明:

    对于该演练,请不要对您的站点使用模拟身份验证。即只对该演练使用匿名身份验证作为 ASP.NET 应用程序的标识。对于本演练,如果您的应用程序的标识为您当前登录所用的用户 ID(如 DOMAIN\userid),请在该应用程序的 Web.config 文件中禁用模拟。若要禁用模拟,请编辑 Web.config 文件并移除 <identity> 元素。完成此更改后,请更新浏览器中的 identity.aspx 以显示修改后的应用程序标识。

  4. 在命令提示处,通过运行 aspnet_regiis.exe 使用下列选项授予标识对 RSA 密钥容器的访问权限:

    • -pa 选项后跟名为 "MyKeys" 的 RSA 密钥容器。

    • 在前一步中确定的 ASP.NET 应用程序的标识。

    例如,下面的命令授予 NETWORK SERVICE 帐户对计算机级别的 "MyKeys" RSA 密钥容器的访问权限。

    2w117ede.alert_note(zh-cn,VS.100).gif说明:

    在运行 Windows Server 2003 的计算机上,如果在 Web.config 文件中禁用了 ASP.NET 应用程序的模拟,则该应用程序的标识将为 NETWORK SERVICE 帐户(对于 Windows 的早期版本,此标识为本地 ASPNET 帐户)。

    aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"

在这部分演练中,您将在 ASP.NET 应用程序的 Web.config 文件中指定“受保护配置”提供程序的实例。“受保护配置”提供程序的实例使用名为 "MyKeys" 的计算机级别 RSA 密钥容器,该实例是在上述过程中创建的。

若要指定“受保护配置”提供程序的实例

  1. 打开文本编辑器,然后打开 ASP.NET 应用程序的 Web.config 文件。

    • 如果 ASP.NET 应用程序没有 Web.config 文件,请打开文本编辑器,然后将示例配置复制到一个新文件中。在 ASP.NET 应用程序目录中,将文件另存为 web.config。

  2. 确保该配置包括 <connectionStrings> 元素,如下面的示例所示。

     
     
    <configuration>
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    </configuration>
    
  3. 添加 <configProtectedData> 节,其中包括名为 "MyProvider" 的 RsaProtectedConfigurationProvider 类的实例,这个类使用名为 "MyKeys", 的计算机级别 RSA 密钥容器,如下面的示例所示。

     
     
    <configuration>
       <configProtectedData>
          <providers>
             <add name="MyProvider"
                  type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
                        Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
                        processorArchitecture=MSIL"
                  keyContainerName="MyKeys" 
                  useMachineContainer="true" />
          </providers>
       </configProtectedData>
    
       <connectionStrings>
          <add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
       </connectionStrings>
    </configuration>
    
  4. 保存并关闭 Web.config 文件。

既然已经指定使用 "MyKeys" RSA 密钥容器的 RsaProtectedConfigurationProvider 类的实例,并且 ASP.NET 应用程序的标识能够读取 "MyKeys",请使用 "MyKeys" 对 ASP.NET 应用程序的 Web.config 文件的节进行加密,然后 ASP.NET 在处理 Web.config 文件时会对文件的节进行解密。

对 Web.config 文件的 <connectionStrings> 节进行加密

  1. 在命令提示处,运行带有下列选项的 aspnet_regiis.exe:

    • -pe 选项,后跟 "connectionStrings",用于对应用程序的 Web.config 文件的 <connectionStrings> 元素进行加密。

    • -app 选项,用于标识应用程序的名称。

    • -prov 选项后跟 "MyProvider",用于标识在上述步骤中 Web.config 文件中指定的 RsaProtectedConfigurationProvider 提供程序。

    例如,下面的命令将加密 MyApplication 应用程序的 Web.config 文件的 <connectionStrings> 节。

    aspnet_regiis -pe "connectionStrings" -app "/MyApplication" -prov "MyProvider"

  2. 打开 Web.config 文件并查看已加密的内容。

    内容与下面的示例 Web.config 文件类似。

     
     
    <configuration>
       <configProtectedData>
          <providers>
             <add name="MyProvider"
                  type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
                        Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a,
                        processorArchitecture=MSIL"
                  keyContainerName="MyKeys" 
                  useMachineContainer="true" />
          </providers>
       </configProtectedData>
    
       <connectionStrings configProtectionProvider="MyProvider">
          <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>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo=
                      </CipherValue>
                   </CipherData>
                </EncryptedKey>
             </KeyInfo>
             <CipherData>
                <CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE=
                </CipherValue>
             </CipherData>
          </EncryptedData>
       </connectionStrings>
    </configuration>
    
  3. 关闭 Web.config 文件。

ASP.NET 在处理 Web.config 文件时会自动对该文件的内容进行解密。因此,不需要任何步骤即可对已加密的配置设置进行解密,供其他 ASP.NET 功能使用或用于访问代码中的值。但是,若要查看已解密的设置,您可以遵循下面的步骤操作。

查看已解密的配置值

  1. 打开文本编辑器,然后将下面的 ASP.NET 代码复制到一个新文件中。

     
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Configuration" %>
    <script runat="server">
    
    Public Sub Page_Load()
    
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings
      ConnectionStringsGrid.DataBind()
    End Sub
    
    </script>
    <html>
    
    <body>
    
    <form runat="server">
      <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
     
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Configuration" %>
    <script runat="server">
    
    public void Page_Load()
    {
      ConnectionStringsGrid.DataSource = ConfigurationManager.ConnectionStrings;
      ConnectionStringsGrid.DataBind();
    }
    
    </script>
    <html>
    
    <body>
    
    <form runat="server">
      <asp:GridView runat="server" CellPadding="4" id="ConnectionStringsGrid" />
    </form>
    
    </body>
    </html>
    
  2. 将该文件另存为 “walkthrough.aspx”,然后在浏览器中查看该文件。

    您将看到加密的 Web.config 文件中已解密的值。

可以将 RSA 密钥容器导出到一个 XML 文件作为密钥值的备份副本,或者将密钥容器复制到其他 Web 服务器,这些服务器将承载包括已加密的 Web.config 文件的应用程序的副本。如果没有用于加密 Web.config 文件的特定 RSA 密钥容器,则 ASP.NET 将无法对已加密的配置值进行解密。

查看已解密的配置值

  1. 在命令提示处,运行带有下列选项的 aspnet_regiis.exe:

    • -px 选项后跟 "MyKeys",它是在本演练的前一部分“创建自定义的 RSA 密钥容器”中创建的 RSA 密钥容器的名称。

    • 将密钥容器导出到的 .xml 文件的路径。

    • -pri 选项,用于确保已导出私钥信息。否则,导出的密钥信息只能对信息进行加密,而不能进行解密。

    例如,下面的命令将名为 "MyKeys" 的计算机级别 RSA 密钥容器导出到名为 keys.xml 的 .xml 文件,该文件位于 C 驱动器的根目录下。

    aspnet_regiis -px "MyKeys" "c:\keys.xml" -pri

    2w117ede.alert_note(zh-cn,VS.100).gif说明:

    为了确保没有人可以对已经用 RSA 密钥容器加密的 Web.config 文件进行解密,将 RSA 密钥容器导出到 .xml 文件后,请将 .xml 文件复制到 Web 服务器的外部位置,然后从 Web 服务器上删除该文件。

    您现在具有使用已加密的 Web.config 文件将应用程序复制到独立 Web 服务器所需的所有信息。

  2. 如果要使用已加密的 Web.config 文件将应用程序复制到独立的 Web 服务器中,请转到步骤 4。

  3. 如果您没有第二台需要复制 Web 应用程序的 Web 服务器,并且要继续本演练,请完成下面的步骤从 Web 服务器中删除 RSA 密钥容器。然后,将这台 Web 服务器视为第二台 Web 服务器。

    1. 若要删除 RSA 密钥容器,请在命令提示处运行带有 -pz 开关的 aspnet_regiis.exe,后跟 "MyKeys"

      例如,下面的命令将删除 "MyKeys"

      aspnet_regiis -pz "MyKeys"

    2. 转到步骤 5。

  4. 将包括已加密的 Web.config 文件的 Web 应用程序复制到另一台 Web 服务器。

    • 如果您不确定如何将 Web 应用程序复制到第二台服务器,请将现有应用程序中的所有文件夹和内容复制到第二台 Web 服务器中,然后按照如何:在 IIS 5.0 和 6.0 中创建和配置虚拟目录中的步骤将应用程序标识为 Web 应用程序。

  5. 在第二台服务器上,打开命令提示窗口,然后输入以下命令将目录更改为 .NET Framework 2.0 版目录:

    cd \WINDOWS\Microsoft.Net\Framework\v2.0.*

  6. 将包含已导出的 RSA 密钥容器的 .xml 文件复制到第二台 Web 服务器上的 .NET Framework 2.0 版的目录中。

    在此演练中,将 keys.xml 文件复制到驱动器 C 的根目录下。

  7. 在第二台 Web 服务器的命令提示处,运行带有下列选项的 aspnet_regiis.exe:

    • -pi 选项,后跟已导出的密钥容器的名称 "MyKeys",用于导入 RSA 密钥容器。

    • 包含已导出的密钥容器的 .xml 文件的路径

    例如,下面的命令会导入名称为 "MyKeys" 的 RSA 密钥容器。

    aspnet_regiis -pi "MyKeys" "c:\keys.xml"

  8. 在第二台 Web 服务器上,删除包含已导出的 RSA 密钥容器的 .xml 文件的副本。

  9. 在第二台 Web 服务器上,确定 ASP.NET 应用程序的标识,并按照本演练的前一部分“授予对 RSA 加密密钥的读取权限”中的步骤授予该标识对已导入的 RSA 密钥容器的访问权限。

  10. 在第二台 Web 服务器上,遵循上述部分中的步骤查看已加密 Web.config 文件中的已解密配置设置。

posted @ 2016-11-13 14:00  美丽的矩阵  阅读(486)  评论(0编辑  收藏  举报