首页  ·  知识 ·  云计算
asp.net2.0中的数据保护
佚名  http://www.2mysite.net/  综合  编辑:dezai  图片来源:网络
使用受保护的配置加密配置信息不用可读或容易解码的格式存储高度敏感的信息,这是保护应用程序的一个方面。敏感信息的示
使用受保护的配置加密配置信息  

不用可读或容易解码的格式存储高度敏感的信息,这是保护应用程序的一个方面。敏感信息的示例包括用户名、密码、连接字符串和加密密钥。将敏感信息以不可读的格式存储,可以使攻击者很难获得对敏感信息的访问权限(即使攻击者获得了对文件、数据库或其他存储位置的访问权限),从而可以增强应用程序的安全性。

ASP.NET 应用程序中存储敏感信息的主要位置之一是 Web.config 文件。为了帮助保护配置文件中的信息,ASP.NET 提供了一项称为“受保护配置”的功能,可用于加密配置文件中的敏感信息。

受保护配置概述  

可以使用受保护配置来加密 Web 应用程序配置文件(如 Web.config 文件)中的敏感信息(包括用户名和密码、数据库连接字符串和加密密钥)。对配置信息进行加密后,即使攻击者获取了对配置文件的访问,也可以使攻击者难以获取对敏感信息的访问,从而改进应用程序的安全性。

例如,未加密的配置文件中可能包含一个指定用于连接到数据库的连接字符串的节,如下面的示例所示:

  
    
   


使用受保护配置对连接字符串值进行加密的配置文件不以明文形式显示连接字符串,而是以加密形式存储它们,如下面的示例所示:


  
    http://www.w3.org/2001/04/xmlenc#Element"
      xmlns="http://www.w3.org/2001/04/xmlenc#">
      http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
      http://www.w3.org/2000/09/xmldsig#">
        http://www.w3.org/2001/04/xmlenc#">
          http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
          http://www.w3.org/2000/09/xmldsig#">
            RSA Key
          
          
            RXO/zmmy3sR0iOJoF4ooxkFxwelVYpT0riwP2mYpR3FU+r6BPfvsqb384pohivkyNY7Dm4lPgR2bE9F7k6TblLVJFvnQu7p7d/yjnhzgHwWKMqb0M0t0Y8DOwogkDDXFxs1UxIhtknc+2a7UGtGh6Di3N572qxdfmGfQc7ZbwNE=
            

          

        
      
      
        KMNKBuV9nOid8pUvdNLY5I8R7BaEGncjkwYgshW8ClKjrXSM7zeIRmAy/cTaniu8Rfk92KVkEK83+UlQd+GQ6pycO3eM8DTM5kCyLcEiJa5XUAQv4KITBNBN6fBXsWrGuEyUDWZYm6Eijl8DqRDb11i+StkBLlHPyyhbnCAsXdz5CaqVuG0obEy2xmnGQ6G3Mzr74j4ifxnyvRq7levA2sBR4lhE5M80Cd5yKEJktcPWZYM99TmyO3KYjtmRW/Ws/XO3z9z1b1KohE5Ok/YX1YV0+Uk4/yuZo0Bjk+rErG505YMfRVtxSJ4ee418ZMfp4vOaqzKrSkHPie3zIR7SuVUeYPFZbcV65BKCUlT4EtPLgi8CHu8bMBQkdWxOnQEIBeY+TerAee/SiBCrA8M/n9bpLlRJkUb+URiGLoaj+XHym//fmCclAcveKlba6vKrcbqhEjsnY2F522yaTHcc1+wXUWqif7rSIPhc0+MT1hB1SZjd8dmPgtZUyzcL51DoChy+hZ4vLzE=
        

      

    
  


在对页进行请求时,.NET Framework 对连接字符串信息进行解密,并使其可供应用程序使用。

注意 
不能使用受保护配置来加密配置文件的 configProtectedData 节。也不能使用受保护配置来加密不使用节处理程序的配置节或者属于托管密码配置的节。下面是不能使用受保护配置进行加密的配置节的列表:processModel、runtime、mscorlib、startup、system.runtime.remoting、configProtectedData、satelliteassemblies、cryptographySettings、cryptoNameMapping 和 cryptoClasses。建议您使用其他方法(如 ASP.NET 设置注册表控制台应用程序 Aspnet_setreg.exe 工具)来加密敏感信息,以保护这些配置节中的敏感信息。有关 ASP.NET 设置注册表控制台应用程序 (Aspnet_setreg.exe) 的信息,请参见 Microsoft 知识库中的文章 Q329290“How to use the ASP.NET utility to encrypt credentials and session state connection strings”(如何使用 ASP.NET 实用工具加密凭据和会话状态连接字符串),知识库网址为 Microsoft 支持网站。

安全注意 
在将加密配置信息加载到应用程序使用的内存中时,会对这些信息进行解密。如果应用程序的内存受到安全威胁,则受保护配置节中的敏感信息可能也会受到安全威胁。 

使用受保护配置
可以使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 或 System.Configuration 命名空间中的受保护配置类来管理受保护配置。

Aspnet_regiis.exe 工具(位于 %SystemRoot%\Microsoft.NET\Framework\versionNumber 文件夹中)中包括用于下列内容的选项:对 Web.config 文件的节进行加密和解密、创建或删除密钥容器、导出和导入密钥容器信息以及管理对密钥容器的访问。

通过使用 ProtectedConfigurationProvider 类可以对 Web.config 文件的内容进行加密和解密。下面的列表描述了包括在 .NET Framework 中的受保护配置提供程序:

DPAPIProtectedConfigurationProvider。使用 Windows 数据保护 API (DPAPI) 对数据进行加密和解密。

RsaProtectedConfigurationProvider。使用 RSA 加密算法对数据进行加密和解密。 

这两个提供程序都提供对数据的强加密;但是,如果您打算在多台服务器(如网络场)上使用同一个加密配置文件,则只有使用 RsaProtectedConfigurationProvider 才能导出用于对数据进行加密的加密密钥,并在另一台服务器上导入它们。

您可以通过在应用程序的 Web.config 文件中配置它来指定要使用哪个 ProtectedConfigurationProvider,也可以使用在 Machine.config 文件中配置的 ProtectedConfigurationProvider 实例之一。有关更多信息,请参见指定受保护的配置提供程序。

在指定了要使用的提供程序之后,可以对应用程序的 Web.config 文件的内容进行加密或解密。有关更多信息,请参见加密和解密配置节。

注意 
作为保护 Web 应用程序的最佳做法,您需要不断地更新应用程序服务器,安装最新的 Microsoft Windows 和 Internet 信息服务 (IIS) 安全修补程序以及 Microsoft SQL Server 或其他成员资格数据源的任何安全修补程序,这一点很重要。有关编写安全代码和保护应用程序安全的最佳做法的详细信息,请参见由 Michael Howard 和 David LeBlanc 编写的书籍 Writing Secure Code(《编写安全代码》)以及由 Microsoft Patterns and Practices(Microsoft 的模式与实践) 网站提供的指导。
 
导入和导出受保护的配置 RSA 密钥容器  

受保护的配置提供了在使用 RsaProtectedConfigurationProvider 时创建、删除、导出和导入 RSA 密钥容器的能力。对于将同一个经过加密的 Web.config 文件部署到数台服务器上的网络场,这会非常有用。在这种情况下,还必须将相同的 RSA 密钥容器部署到这些服务器上。为了实现此目的,需要为应用程序创建一个 RSA 密钥容器,将它导出到 XML 文件,然后在每台需要对加密的 Web.config 文件进行解密的服务器上导入该文件。

在承载多个 ASP.NET 应用程序的单台 Web 服务器上,创建 RSA 密钥容器也非常有用。通过为一个客户的每个或每组应用程序都创建一个 RSA 密钥容器,可以确保一个应用程序的 RSA 密钥容器不能用来对另一个应用程序的 Web.config 文件进行解密,从而提高应用程序的敏感配置信息的安全性。

创建 RSA 密钥容器
若要创建 RSA 密钥容器,请使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 及 –pc 开关。必须为密钥容器指定一个名称,该名称标识应用程序的 Web.config 文件的 configProtectedData 节中指定的 RsaProtectedConfigurationProvider 所使用的密钥容器。为确保可以导出新创建的 RSA 密钥容器,必须包括 -exp 选项。

例如,下面的命令创建一个名为 SampleKeys 的 RSA 密钥容器,该容器是可导出的计算机级密钥容器。
aspnet_regiis -pc "SampleKeys"–exp
 

下面的示例演示了 Web.config 文件的 configProtectedData 节。该节指定使用名为 SampleKeys 的计算机级 RSA 密钥容器的 RsaProtectedConfigurationProvider。

   
                 type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
                 Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
                 processorArchitecture=MSIL"
           keyContainerName="SampleKeys" 
           useMachineContainer="true" />
   

授予对 RSA 密钥容器的访问权限
默认情况下,RSA 密钥容器受到所在服务器上的 NTFS 访问控制列表 (ACL) 的严密保护。这样能够限制可以访问加密密钥的人员,从而增强加密信息的安全性。

必须首先向 ASP.NET 应用程序的进程标识授予对该 RSA 密钥容器的读取访问权限,然后 ASP.NET 才能使用 RSA 密钥容器。有关设置和确定 ASP.NET 应用程序标识的信息,请参见 ASP.NET 模拟。

可以使用 Aspnet_regiis.exe 工具及 -pa 开关,向 ASP.NET 应用程序的标识授予读取 RSA 密钥容器的权限。例如,下面的命令向 Windows Server 2003 NETWORK SERVICE 帐户授予对名为 SampleKeys 的计算机级 RSA 密钥容器的读取访问权限:
aspnet_regiis -pa "SampleKeys" "NT AUTHORITY\NETWORK SERVICE"


注意 
如果 RSA 密钥容器是用户级容器,必须以其 Windows 配置文件存储了密钥的用户的身份登录,并且必须包括 -pku 选项以授予对该用户级 RSA 密钥容器的访问权限。有关更多信息,请参见了解计算机级别和用户级别的 RSA 密钥容器。 

若要使用计算机配置中指定的默认 RsaProtectedConfigurationProvider,必须首先向应用程序的 Windows 标识授予对名为 NetFrameworkConfigurationKey 的计算机密钥容器的访问权限,该计算机密钥容器是为该默认提供程序指定的密钥容器。例如,下面的命令向 NETWORK SERVICE 帐户授予对默认 RsaProtectedConfigurationProvider 所使用的 RSA 密钥容器的访问权限。
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"


NetFrameworkConfigurationKey RSA 密钥容器是 Aspnet_regiis.exe 工具所发出的命令的默认密钥容器。因此上述命令也可以按以下方式发出:
aspnet_regiis -pa "NT AUTHORITY\NETWORK SERVICE"


导出 RSA 密钥容器
若要将 RSA 密钥容器导出到 XML 文件,可以使用 Aspnet_regiis.exe 工具及 –px 开关。XML 文件可以用作 RSA 密钥容器的备份,也可用于在其他服务器上导入 RSA 密钥容器。若要对加密信息进行解密,则 RSA 密钥容器的私钥部分是必需的。若要在另一台服务器上使用导出的密钥容器,则还需导入私钥。通过在导出密钥时指定 –pri 选项,则可以在 XML 文件中包括私钥。还必须指定导出的密钥容器是计算机级还是用户级的。若要导出用户级密钥容器,必须以其 Windows 配置文件存储了密钥的用户的身份登录。若要指定用户级密钥,请在导出加密密钥信息时包括 -pku 选项;否则,导出的密钥将来自计算机密钥存储区。有关计算机级和用户级加密密钥的更多信息,请参见了解计算机级别和用户级别的 RSA 密钥容器。

例如,下面的命令将名为 SampleKeys 的计算机级 RSA 密钥容器导出到名为 keys.xml 的文件中并包括了私钥信息。
aspnet_regiis -px "SampleKeys" keys.xml -pri


注意 
出于安全原因,在将 RSA 密钥容器导出到某个 XML 文件之后,请将该 XML 文件复制到服务器外部的一个位置并将该 XML 文件从服务器中删除。这样能够减少攻击者访问到您的 RSA 密钥容器的机会,因而可降低攻击者对使用该 RSA 密钥容器加密的 Web.config 文件进行解密的能力。 

导入 RSA 密钥容器
可以使用 Aspnet_regiis.exe 工具和 –pi 开关,从 XML 文件导入 RSA 密钥容器。还必须指定导入的密钥容器是计算机级还是用户级的密钥容器。若要导入用户级密钥容器,必须以将在其 Windows 配置文件中存储密钥的用户的身份登录。若要指定用户级密钥,请在导入加密密钥信息时包括 -pku 选项;否则,导出的密钥将导入到计算机密钥存储区中。

例如,下面的命令从名为 keys.xml 的文件中导入名为 SampleKeys 的计算机级 RSA 密钥容器:
aspnet_regiis -pi "SampleKeys" keys.xml
必须向将使用所导入 RSA 密钥容器的 ASP.NET 应用程序的标识授予对该 RSA 密钥容器内容的读取权限。有关更多信息,请参见本主题前面的“授予对 RSA 密钥容器的访问权限”。

删除 RSA 密钥容器
若要删除 RSA 密钥容器,可以使用 Aspnet_regiis.exe 工具和 –pz 开关。在删除 RSA 密钥容器之前,请确保已经将密钥导出到 XML 文件中以便能够在以后导入,或者确保不需要解密任何用 RSA 密钥容器加密的信息。

在删除某个 RSA 密钥容器时,必须指定该密钥容器的名称,并将该容器标识为计算机级或用户级。若要删除用户级密钥容器,必须以其 Windows 配置文件存储了密钥的用户的身份登录。

例如,下面的命令删除名为 SampleKeys 的计算机级 RSA 密钥容器。
aspnet_regiis -pz "SampleKeys"


加密和解密配置节  

可以使用 ASP.NET IIS 注册工具 (Aspnet_regiis.exe) 加密或解密 Web 配置文件的各节。在处理 Web.config 文件时,ASP.NET 将自动解密已加密的配置元素。

注意 
Aspnet_regiis.exe 工具位于 %windows%\Microsoft.NET\Framework\versionNumber 文件夹中。
 
也可以使用 System.Configuration 命名空间中的受保护配置类来加密和解密 Web 配置文件的各节、可执行文件 (.exe) 的配置文件的各节或者计算机级和应用程序级配置文件的各节。有关更多信息,请参见 SectionInformation 类的 ProtectSection 方法。有关引用 Web.config 文件的某一节的信息,请参见 WebConfigurationManager 类。有关引用 Web.config 文件以外其他文件的配置节的信息,请参见 ConfigurationManager 类。

加密 Web 配置节
要加密配置文件的内容,应将 Aspnet_regiis.exe 工具与 –pe 选项以及要加密的配置元素的名称一起使用。

使用 –app 选项可标识将加密其 Web.config 文件的应用程序,使用 -site 选项可标识该应用程序所属的网站。网站是使用 Internet 信息服务 (IIS) 元数据库中的站点号标识的。可以从 ServerVariables 集合中的 INSTANCE_META_PATH 服务器变量中检索站点号。例如,安装 IIS 时,会创建名为“默认网站”的网站作为站点 1。在该站点提供的页中,INSTANCE_META_PATH 服务器变量返回“/LM/W3SVC/1”。如果未指定 -site 选项,将使用站点 1。

使用 –prov 选项可标识将执行加密和解密的 ProtectedConfigurationProvider 的名称。如果未使用 -prov 选项指定提供程序,将使用配置为 defaultProvider 的提供程序。

注意 
如果您使用的是指定自定义密钥容器的 RsaProtectedConfigurationProvider 实例,则必须在运行 Aspnet_regiis.exe 工具前创建密钥容器。有关更多信息,请参见导入和导出受保护的配置 RSA 密钥容器。 

下面的命令加密应用程序 SampleApplication 的 Web.config 文件中的 connectionStrings 元素。由于不包含 -site 选项,因此假定该应用程序来自网站 1(IIS 中最常用的默认网站)。加密是使用计算机配置中指定的 RsaProtectedConfigurationProvider 执行的。
aspnet_regiis -pe "connectionStrings" -app "/SampleApplication" -prov "RsaProtectedConfigurationProvider"

在请求应用程序中的页或其他 ASP.NET 资源时,ASP.NET 会对受保护配置节调用提供程序,以解密信息供 ASP.NET 和应用程序代码使用。

注意 
要解密和加密 Web.config 文件的某一节,ASP.NET 进程必须具有读取适当加密密钥信息的权限。有关更多信息,请参见导入和导出受保护的配置 RSA 密钥容器。 

解密 Web 配置节
要解密已加密的配置文件内容,应将 Aspnet_regiis.exe 工具与 -pd 开关以及要解密的配置元素的名称一起使用。使用 –app 和 -site 开关可标识将解密其 Web.config 文件的应用程序。无需指定 –prov 开关来标识 ProtectedConfigurationProvider 的名称,因为该信息是从受保护配置节的 configProtectionProvider 属性中读取的。

下面的命令解密 ASP.NET 应用程序 SampleApplication 的 Web.config 文件中的 connectionStrings 元素:
aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"


受保护配置概述 
指定受保护的配置提供程序 
加密和解密配置节 
导入和导出受保护的配置 RSA 密钥容器 
了解计算机级别和用户级别的 RSA 密钥容器 
演练:使用受保护的配置加密配置信息 
演练:创建和导出 RSA 密钥容器 
实现受保护配置提供程序
 
参考
ProtectedConfiguration
本文作者:佚名 来源:http://www.2mysite.net/
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读