`
yanyanquan
  • 浏览: 453041 次
  • 性别: Icon_minigender_1
  • 来自: 江门
社区版块
存档分类
最新评论

松加密ASP.NET 2.0 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已经提供了相对容易的加密和解密技术,开发者毫无理由不使用这种方式来保护你的敏感的配置设置。

 

转:http://www.cnblogs.com/deymmtd/archive/2009/03/26/1422641.html

分享到:
评论

相关推荐

    ASP.NET 2.0网站开发全程解析(C#)

    7. **安全性**:ASP.NET 2.0包含了一系列安全特性,如身份验证、授权、加密和安全套接层(SSL),以保护Web应用程序免受攻击。 8. **Web部件**:Web部件框架允许开发者创建可重用的、自包含的组件,这些组件可以在...

    ASP.NET 2.0动态网站开发基础教程(C#) 第10章 配置ASP.NET应用程序 缓存技术(共12页).ppt

    ASP.NET 2.0动态网站开发基础教程(C#) 第01章 ASP.NET2.0基础 Framework Web Form(共32页).ppt ASP.NET 2.0动态网站开发基础教程(C#) 第02章 HTML和脚本语言 VBScript javaScript(共21页).ppt ASP.NET 2.0...

    ASP.NET 2.0入门经典:C#编程篇(pdf英文原版)

    《ASP.NET 2.0入门经典:C#编程篇》是一本专为初学者设计的教程,旨在引导读者深入理解ASP.NET 2.0框架,掌握C#编程基础,从而能够构建功能丰富的Web应用程序。这本书的英文原版提供了一种全球视野,让读者能与国际...

    《ASP.Net 2.0 + SQL Server 网络应用系统开发案例精解》

    在ASP.NET 2.0版本中,引入了许多新特性和改进,如控件事件模型、母版页(Master Pages)、主题(Themes)、皮肤(Skin)、配置管理工具等。这些特性极大地提高了开发效率,简化了代码,使得网页设计更加美观且易于...

    ASP.NET 2.0入门经典4(中文版)

    在ASP.NET 2.0中,成员关系是构建Web应用程序的关键组件,它允许网站创建用户身份验证和授权系统,实现个性化和安全的用户体验。本章深入探讨了如何利用ASP.NET 2.0的成员关系功能,以创建一个用户可以轻松登录并...

    ASP.NET 2.0动态网站开发基础教程(C#)配套asp.net学习手册 全套PPT课程 共11个章节.rar

    ASP.NET 2.0动态网站开发基础教程(C#)第01章 ASP.NET2.0基础 Framework Web Form(共32页).ppt ASP.NET 2.0动态网站开发基础教程(C#)第02章 HTML和脚本语言 VBScript javaScript(共21页).ppt ASP.NET 2.0动态...

    ASP.NET 2.0电子商务高级编程(C#2005版)

    1. **ASP.NET 2.0核心概念**:ASP.NET 2.0是微软.NET Framework的一部分,提供了构建Web应用程序的强大工具。它引入了许多新特性,如母版页(Master Pages)、站点导航(Site Navigation)、数据绑定控件(Data ...

    圣殿祭司的ASP.NET 2.0开发详解c# 3-4

    《圣殿祭司的ASP.NET 2.0开发详解c# 3-4》文档主要涵盖了ASP.NET 2.0框架下使用C#语言进行Web应用程序开发的核心技术和实践要点。在这一部分,作者深入浅出地讲解了C# 2.0及3.0中的新特性,以及如何在ASP.NET环境中...

    深入挖掘ASP.NET 2.0系列课程(8):建立安全的ASP.NET 2.0网站.zip

    ASP.NET 2.0是微软.NET Framework下的一个Web应用程序开发框架,它为开发者提供了构建动态网站、Web应用程序和Web服务的强大工具和功能。相比其前身ASP.NET 1.x,ASP.NET 2.0引入了许多改进和新特性,包括控件模型的...

    ASP.NET 2.0+sql2005电子商务网站

    ASP.NET 2.0是.NET Framework的核心部分,专为开发动态Web应用程序而设计。它通过简化Web开发,让开发者能够专注于业务逻辑的实现,而不是底层技术细节。ASP.NET 2.0的主要特点对于构建电子商务网站尤为重要。 页面...

    Beginning ASP.NET 2.0 E-Commerce in C#

    《初识ASP.NET 2.0电子商务应用C#》是一个基于三层架构的Web应用程序实例,专为学习ASP.NET 2.0技术的开发者提供。这个项目深入浅出地展示了如何构建一个功能完备的在线购物平台,是理解B/S(Browser/Server)架构...

    ASP.net 2.0+SQL Server 2005从入门到精髓内容及代码

    ASP.NET 2.0 和 SQL Server 2005 是微软技术栈中两个重要的组成部分,它们在构建企业级Web应用程序方面发挥了关键作用。ASP.NET 2.0 是.NET Framework的一部分,提供了一种强大的服务器端编程模型,而SQL Server ...

    ASP.NET 2.0快速入门(6):ASP.NET 2.0 成员管理

    ASP.NET 2.0是微软推出的Web应用程序框架,它极大地简化了Web开发流程,并提供了丰富的功能,特别是对于成员管理和身份验证。在这个快速入门教程中,我们将深入探讨ASP.NET 2.0的成员管理机制,它是构建安全、用户...

    ASP.NET 2.0 双向探针程序 源码

    ASP.NET 2.0 双向探针程序是一款基于ASP.NET 2.0技术开发的监控和诊断工具,主要用于帮助开发者和系统管理员实时监控Web应用程序的运行状态和性能指标。这款源码提供了一种双向通信机制,即不仅能够从服务器端获取...

    5ASP.NET 2.0 web安全和角色编程

    ASP.NET 2.0是微软开发的一个用于构建Web应用程序的框架,它在.NET Framework的基础上提供了丰富的功能和工具,包括强大的Web安全性和角色编程机制。在ASP.NET 2.0中,开发者可以更轻松地实现安全的网站开发,保护...

    ASP.NET+2.0动态网站开发教程

    ASP.NET 2.0是微软推出的一种用于构建Web应用程序的框架,它建立在.NET Framework 2.0之上,为开发者提供了强大的工具集和丰富的功能,用于创建动态、交互式的网站。本教程旨在全面讲解如何使用ASP.NET 2.0进行高效...

    asp.net 2.0快速入门

    1. 配置系统:ASP.NET 2.0使用XML格式的Web.config文件进行配置,涵盖了应用程序的设置、安全性和身份验证等,方便开发者进行灵活的配置管理。 2. 部署策略:了解如何将ASP.NET 2.0应用程序部署到IIS服务器,包括...

    ASP.NET2.0全程指南

    ASP.NET 2.0 是微软开发的一个用于构建Web应用程序的框架,它是在ASP.NET 1.x的基础上进行的重大升级,提供了许多新的特性和改进,旨在提高开发效率和性能。本"ASP.NET 2.0全程指南"将深入探讨这个版本的核心概念、...

    ASP.NET 2.0全程指南数据库

    讨论如何在生产环境中部署ASP.NET 2.0应用程序,以及如何设置IIS、配置安全策略,如身份验证(Forms Authentication)、授权(Role-based Authorization)和数据加密等。 综上所述,"ASP.NET 2.0全程指南数据库"将...

Global site tag (gtag.js) - Google Analytics