轻松加密ASP.NET 2.0 Web程序配置信息

asp.net|web|程序|加密

  一、 简介

  当创建ASP.NET 2.0应用程序时,开发者通常都把敏感的配置信息存储在Web.config文件中。最典型的示例就是数据库连接字符串,但是包括在Web.config文件中的其它敏感信息还包括SMTP服务器连接信息和用户凭证数据,等等。尽管默认情况下可以配置ASP.NET以拒绝所有对扩展名为.config的文件资源的HTTP请求;但是,如果一个黑客能够存取你的web服务器的文件系统的话,那么,Web.config中的敏感信息仍然能够被窃取。例如,也许你不小心允许匿名FTP存取你的网站,这样以来就允许一个黑客简单地通过FTP协议下载你的Web.config文件。

  幸好,通过允许加密Web.config文件中选择的部分,例如<connectionStrings>节,或你的应用程序使用的一些定制config节,ASP.NET 2.0有助于缓解这个问题。配置部分能够很容易地使用编码或aspnet_regiis.exe(一个命令行程序)预以加密。一旦被加密,Web.config设置即可避开"虎视眈眈"的眼睛。而且,当以编程方式从你的ASP.NET页面中检索加密的配置设置时,ASP.NET会自动地解密它读取的加密部分。简言之,一旦配置信息被加密,你就不需要在你的应用程序中编写任何其它代码或采取任何进一步的行为来使用该加密数据。

  在本文中,我们将讨论如何以编程方式加密和解密该配置设置部分,并且分析一下命令行程序aspnet_regiis.exe的使用。然后,我们将评估ASP.NET 2.0提供的加密选项。另外,还会简短地讨论一下如何加密ASP.NET版本1.x中的配置信息。

  二、 前提

  在我们开始探讨如何加密ASP.NET 2.0配置信息之前,请记住下列几点:

  1. 所有形式的加密都会包含某种秘密,而当加密和解密数据时都要使用这一秘密。对称加密算法在加密和解密一个消息时使用同一把密钥,而非对称加密算法对于加密和解密却使用不同的密钥。无论使用哪种技术,最重要的还是看解密密钥的安全保存程度。

  2. ASP.NET 2.0提供的配置加密技术的设计目的在于,力图阻止能够以某种方式检索你的配置文件的黑客的入侵。其实现思想是,如果在黑客的计算机上有你的Web.config文件;那么,他不能破解该加密的部分。然而,当web服务器上的一个ASP.NET页面从一个加密的配置文件请求信息时,该数据必须被解密才能使用(并且这时不需要你编写任何代码)。因此,如果一个黑客能够把一个能够查询配置文件并显示它的结果的ASP.NET web页面上传到你的系统,那么,他就能够以普通文本方式观看被加密的设置。(详细情况请参考本文提供的示例ASP.NET页面,它展示了加密和解密Web.config文件中各部分的方法;如你所见,一个ASP.NET页面能够存取(并显示)该加密数据的普通文本形式)

  3. 加密和解密配置信息需要付出一定的性能代价。因此,通常是仅加密包含敏感信息的配置部分。比如说,可能不需要加密<compilation>或<authorization>配置部分。

  三、 加密何种信息

  在我们分析如何加密ASP.NET 2.0配置信息前,让我们首先来看一下能够加密什么配置信息。使用.NET框架2.0提供的库,开发人员能够加密在Web.config或machine.config文件中的绝大多数的配置部分。这些配置部分是一些作为<configuration>或<system.web>元素子结点的XML元素。例如,下面的示例Web.config文件中含有三个配置设置,显式地定义为:

<connectionStrings>,<compilation>和<authentication>。
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<connectionStrings>
 <add name="MembershipConnectionString" connectionString="connectionString"/>
</connectionStrings>
<system.web>
 <compilation debug="true"/>
 <authentication mode="Forms" />
</system.web>
  这些节中的每一个都可以有选择地被加密,或者通过编程方式或通过aspnet_regiis.exe(一个命令行工具)实现。当被加密时,加密后的文本直接存储在配置文件中。例如,如果我们要加密上面的<connectionStrings>节,那么结果Web.config文件可能看起来如下所示:(注意:篇幅所限,我们省略了一大块<CipherValue>)

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
 <CipherData>
  <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
 </CipherData>
</EncryptedData>
</connectionStrings>
<system.web>
 <compilation debug="true"/>
 <authentication mode="Forms" />
</system.web>
  另外,存在一些你不能使用这个技术加密的配置部分:

  · <processModel>
  · <runtime>
  · <mscorlib>
  · <startup>
  · <system.runtime.remoting>
  · <configProtectedData>
  · <satelliteassemblies>
  · <cryptographySettings>
  · <cryptoNameMapping>
  · <cryptoClasses>

  为了加密这些配置部分,你必须加密这些值并把它存储在注册表中。存在一个aspnet_setreg.exe命令行工具可以帮助你实现这一过程;我们将在本文后面讨论这个工具。

  【提示】Web.Config和Machine.Config之区别:

  Web.config文件指定针对一个特定的web应用程序的配置设置,并且位于应用程序的根目录下;而machine.config文件指定所有的位于该web服务器上的站点的配置设置,并且位于$WINDOWSDIR$\Microsoft.Net\Framework\Version\CONFIG目录下。

  四、加密选项

  开发人员可以使用ASP.NET 2.0提供程序模型来保护配置节信息,这允许任何实现都可以被无缝地插入到该API中。.NET框架2.0中提供了两个内置的提供程序用于保护配置节信息:

  · Windows数据保护API(DPAPI)提供程序(DataProtectionConfigurationProvider):这个提供程序使用Windows内置的密码学技术来加解密配置节。默认情况下,这个提供程序使用本机的密钥。你还能够使用用户密钥,但是这要求进行一点定制。

  · RSA保护的配置提供程序(RSAProtectedConfigurationProvider):使用RSA公钥加密来加解密配置节。使用这个提供程序,你需要创建存储用于加解密配置信息的公钥和私钥的密钥容器。你能够在一个多服务器场所下使用RSA,这只要创建可输出的密钥容器即可。
当然,如果需要的话,你还能够创建自己的保护设置提供程序。

  在本文中,我们仅讨论使用DPAPI提供程序使用机器级密钥。到目前为止,这是最简单的方法,因为它不请求创建任何密钥或密钥容器。当然,其消极的一面在于:一个加密的配置文件仅能够用于首先实现加密的web服务器上;而且,使用机器密钥将允许加密的文本能够被web服务器上的任何网站所解密。

  五、以编程方式加密配置部分

  System.Configuration.SectionInformation类对一个配置节的描述进行了抽象。为了加密一个配置节,只需要简单地使用SectionInformation类的ProtectSection(提供程序)方法,传递你想使用的提供程序的名字来执行加密。为了存取你的应用程序的Web.config文件中的一个特定的配置节,你可以使用WebConfigurationManager类(在System.Web.Configuration命名空间中)来引用你的Web.config文件,然后使用它的GetSection(sectionName)方法返回一个ConfigurationSection实例。最后,你可以经由ConfigurationSection实例的SectionInformation属性得到一个SectionInformation对象。

  下面,我们通过一个简单的代码示例来说明问题:

privatevoid 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.GetSectio n(sectionName);
 if (section != null && section.SectionInformation.IsProtected)
 {
  section.SectionInformation.UnprotectSection();
  config.Save();
 }
  你可以从一个ASP.NET页面中调用这个ProtectSection(sectionName,provider)方法,其相应的参数是一个节名(如connectionStrings)和一个提供程序(如DataProtectionConfigurationProvider),并且它打开Web.config文件,引用该节,调用SectionInformation对象的ProtectSection(provider)方法,最后保存配置变化。

  另一方面,UnProtectSection(provider)方法实现解密一个特定的配置节。在此,仅需要传入要解密的节-我们不需要麻烦提供程序,因为该信息已经存储在伴随encrypted节的标记中(也即是,在上面的示例中的<connectionStrings>节,在被加密以后,它包含了提供程序:<connectionStringsconfigProtectionProvider="DataProtectionConfigurationProvider">)。

  记住,一旦该数据被加密,当从一个ASP.NET页面读取它时(也即是,从一个SqlDataSource控件或以编程方式经由ConfigurationManager.ConnectionStrings[connStringName].ConnectionString读取该连接字符串信息),ASP.NET会自动地解密该连接字符串并且返回普通文本值。换句话说,在实现加密后,你一点不需要改变你的代码。相当酷,对不对?

  从本文下载的示例ASP.NET 2.0网站中,你会发现有一个示例页面,它展示了该站点的Web.config文件,其中有一个多行TextBox,还提供了相应的Web控件按钮用于加密配置文件的各个部分。这个示例中也使用了上面已经讨论过的ProtectSection()和UnProtectSection()方法。

  六、 使用命令行工具aspnet_regiis.exe

  你还能够使用aspnet_regiis.exe命令行工具来加密和解密Web.config文件配置部分,你可以在"%WINDOWSDIR%\Microsoft.Net\Framework\version"目录下找到这个工具。为了加密Web.config文件中的一个节,你可以在这个命令行工具中使用DPAPI机器密钥,如下所示:

  加密一个特定网站的Web.config文件的通用形式:

aspnet_regiis.exe -pef section physical_directory -prov provider
  或:

aspnet_regiis.exe -pe section -app virtual_directory -prov provider
  加密一个特定网站的Web.config文件的具体实例:

aspnet_regiis.exe -pef "connectionStrings" "C:\Inetpub\wwwroot\MySite" -prov "DataProtectionConfigurationProvider"
  或:

aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
  解密一个特定网站的Web.config文件的通用形式:

aspnet_regiis.exe -pdf section physical_directory
  或:

aspnet_regiis.exe -pd section -app virtual_directory
  解密一个特定网站的Web.config文件的具体实例:

aspnet_regiis.exe -pdf "connectionStrings" "C:\Inetpub\wwwroot\MySite"
  或:

  你还能够指定由aspnet_regiis.exe来执行machine.config文件的加密/解密。

  【提示】 加密ASP.NET版本1.x中的配置设置

  为了保护ASP.NET版本1.x中的配置设置,开发者需要加密并把敏感的设置存储在web服务器的注册表中,并以一种"强"键方式存储。配置文件中不是存储加密的内容(如ASP.NET 2.0那样),而只是包含一个到存储该加密值的注册表键的引用。例如:

<identity impersonate="true"
userName="registry:HKLM\SOFTWARE\MY_SECURE_APP\identity\ASPNET_SETREG,userName"
password="registry:HKLM\SOFTWARE\MY_SECURE_APP\identity\ASPNET_SETREG,password" />
  微软为开发人员提供了aspnet_setreg.exe命令行工具,用于加密敏感的配置信息并且把它移动到一个"强"注册表入口处。遗憾的是,这个工具仅针对特定的配置设置工作;相比之下,ASP.NET 2.0允许加密任何配置节。

  有关于在一个ASP.NET 1.x应用程序中使用aspnet_setreg.exe的更多信息请参考MSDN中的KB#32990。遗憾的是,这个命令行程序仅能加密配置设置中的预定义的节,并且不允许你加密你自己添加的数据库连接字符串和其它敏感信息。

  七、 结论

  在本文中,我们学习了如何使用ASP.NET 2.0提供的不同的加密选项来保护配置节信息,还讨论了如何使用编程技术和aspnet_regiis.exe来分别加密Web.config中的配置节。保护你的敏感的配置设置有助于确保你的站点更难于被黑客攻击-通过使其更难于发现敏感的配置设置。如今,ASP.NET 2.0已经提供了相对容易的加密和解密技术,开发者毫无理由不使用这种方式来保护你的敏感的配置设置。

时间: 2024-11-08 19:17:11

轻松加密ASP.NET 2.0 Web程序配置信息的相关文章

用VS2005开发ASP.NET 2.0数据库程序

asp.net|程序|数据|数据库 一. 简介 在2005年11月7日,微软正式发行了.NET 2.0(包括ASP.NET 2.0),Visual Studio 2005和SQL Server 2005.所有这些部件均被设计为可并肩独立工作.也就是说,ASP.NET版本1.x和版本2.0可以安装在同一台机器上:你可以既有Visual Studio.NET 2002/2003和Visual Studio 2005,同时又有SQL Server 2000和SQL Server 2005.而且,微软还

引入ASP.NET 2.0 Web部件连接

当您开始使用 Microsoft .NET Framework 2.0 和 ASP.NET 时,您会发现新 的 Web 部件基础结构将一些非常强大的功能添加到了基础平台中.对于本文, 我假设您已经对 Web 部件的基本知识有所了解,例如,如何使用 WebPartManager 控件.Web 部件区域.编辑器.目录和持久性属性. 创建用于ASP.NET 2.0应用程序的Web部件 您可以用两种方法创建 Web 部件.第一种方法涉及创建一个自定义的 Web 部件类,该类从 System.Web.UI

使用Web标准生成ASP.NET 2.0 Web站点

asp.net|web|web标准|站点    简介 Web 标准使您能通过最少的工作,生成可被最广大受众访问的 Web 站点.Web 标准的承诺是:只需设计页面一次,即可让该页以完全相同的方式在任何现代的浏览器中显示和工作.例如,在按照标准生成以后,旨在在 Microsoft Internet Explorer 中以某种方式显示的页可在其他浏览器(如,Mozilla Firefox.Netscape Navigator.Opera.Camino 和 Safari)中以相同的方式显示,而无需完成

asp.net 4.0+ webform程序中集成mvc4_实用技巧

本文为大家分享了asp.net 4.0+ webform程序中集成mvc4的方法,供大家参考,具体内容如下 1.新建packages.config文件,里面加上必要的程序集  <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targe

ASP.NET 2.0 Web窗体语法指导

asp.net|web|语法 ASP.NET Web窗体页面是一个宣告式的文本文件,扩展名是.aspx.除了静态的内容之外,你还可以使用八种不同的语法标记元素.这一部分回顾这些语法元素并提供了一些使用方法示例. 呈现代码的语法:<% %>和<%= %> 代码呈现块用<% ... %>元素表示,它允许你控制呈现的内容,在Web窗体页面执行的显示阶段执行.下面的例子演示了如何使用它们循环显示HTML的内容. <%@ Page Language="VB&quo

ASP.NET中的应用程序配置

asp.net|程序 ASP.NET配置使用层次式配置体系结构.ASP.NET的所有配置信息都包含了在配置文件中,该文件为config.web,它位于与应用程序文件相同的目录中.除非子目录内的config.web文件覆盖了父目录的设置,否则,子目录降继承父目录的设置. config.web文件为每种主要的ASP.NET功能提供了对应部分. config.web文件中有关安全的内容如下所示:<security> <authentication mode="[windows/coo

ASP.NET 2.0导航功能之配置会员和角色

一.简介 在本文中,我们将探讨ASP.NET 2.0的会员.角色和配置问题.ASP.NET中的会员系统提供了一个可编程API用于创建和管理用户账户,而其中的角色部分使 开发者能够定义一组角色并把用户与角色相关联.典型地,一个提供用户账户的 网站都具有只为某些用户.认证用户或属于特定角色的用户所存取的内容部分. 例如,一个Web站点可能有一组页面--它允许一个可信任用户编辑该Web站 点的内容或管理已有用户.不是简单地试图隐藏这个页面并且希望没有人偶然在 浏览它时遇到麻烦,或硬编码授权而仅仅允许单

程序配置信息的保存

在我们编写的每一个程序中,我们都要保存一些有用的信息,如何保存这些信息呢?比较常用的有三种方法,一种是使用注册表,一种是使用Ini文件,还有就是使用文件.采用那种方法保存配置信息,不同的人可能有不同的习惯,这三种方法那种最适合你的程序呢,究竟那个最方便呢? 一.使用注册表 在BCB中有个TRegistry,它提供了方便的注册表操作,它有几个重要的属性和方法.如下: __property HKEY RootKey = {read=FRootKey, write=SetRootKey, nodefa

asp.net 任何一个web程序,按F5运行都是“无法显示网页”

问题描述 web项目不限于MVCWebForm随便创建一个成功后,按F5全部是无法显示此页..之前正常的项目今天也不行了,不知道为何 解决方案 解决方案二:自己顶一下.只要是web项目,按F5都是"无法显示网页"....无解啊杀毒也杀了,没啥病毒哇.不知道什么原因解决方案三:重启电脑,查看路由是否配置正确.