熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

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

2013-11-13 10:03:44  來源: .NET編程 
簡介

  當創建ASPNET 應用程序時開發者通常都把敏感的配置信息存儲在nfig文件中最典型的示例就是數據庫連接字符串但是包括在nfig文件中的其它敏感信息還包括SMTP服務器連接信息和用戶憑證數據等等 盡管默認情況下可以配置ASPNET以拒絕所有對擴展名nfig的文件資源的HTTP請求但是如果一個黑客能夠存取你的web服務器的文件系統的話那麼nfig中的敏感信息仍然能夠被竊取例如也許你不小心允許匿名FTP存取你的網站這樣以來就允許一個黑客簡單地通過FTP協議下載你的nfig文件

  幸好通過允許加密nfig文件中選擇的部分例如<connectionStrings>節或你的應用程序使用的一些定制config節ASPNET 有助於緩解這個問題配置部分能夠很容易地使用編碼或aspnet_regiisexe(一個命令行程序)預以加密一旦被加密nfig設置即可避開虎視眈眈的眼睛而且當以編程方式從你的ASPNET頁面中檢索加密的配置設置時ASPNET會自動地解密它讀取的加密部分簡言之一旦配置信息被加密你就不需要在你的應用程序中編寫任何其它代碼或采取任何進一步的行為來使用該加密數據

  在本文中我們將討論如何以編程方式加密和解密該配置設置部分並且分析一下命令行程序aspnet_regiisexe的使用然後我們將評估ASPNET 提供的加密選項另外還會簡短地討論一下如何加密ASPNET版本x中的配置信息

   前提

  在我們開始探討如何加密ASPNET 配置信息之前請記住下列幾點

   所有形式的加密都會包含某種秘密而當加密和解密數據時都要使用這一秘密對稱加密算法在加密和解密一個消息時使用同一把密鑰而非對稱加密算法對於加密和解密卻使用不同的密鑰無論使用哪種技術最重要的還是看解密密鑰的安全保存程度

   ASPNET 提供的配置加密技術的設計目的在於力圖阻止能夠以某種方式檢索你的配置文件的黑客的入侵其實現思想是如果在黑客的計算機上有你的nfig文件那麼他不能破解該加密的部分然而當web服務器上的一個ASPNET頁面從一個加密的配置文件請求信息時該數據必須被解密才能使用(並且這時不需要你編寫任何代碼)因此如果一個黑客能夠把一個能夠查詢配置文件並顯示它的結果的ASPNET web頁面上傳到你的系統那麼他就能夠以普通文本方式觀看被加密的設置(詳細情況請參考本文提供的示例ASPNET頁面它展示了加密和解密nfig文件中各部分的方法如你所見一個ASPNET頁面能夠存取(並顯示)該加密數據的普通文本形式)

   加密和解密配置信息需要付出一定的性能代價因此通常是僅加密包含敏感信息的配置部分比如說可能不需要加密<compilation>或<authorization>配置部分

   加密何種信息

  在我們分析如何加密ASPNET 配置信息前讓我們首先來看一下能夠加密什麼配置信息使用NET框架提供的庫開發人員能夠加密在nfig或nfig文件中的絕大多數的配置部分這些配置部分是一些作為<configuration>或<systemweb>元素子結點的XML元素例如下面的示例nfig文件中含有三個配置設置顯式地定義為

<connectionStrings><compilation>和<authentication>
<?xml version=?>
<configuration xmlns=
<connectionStrings>
 <add name=MembershipConnectionString connectionString=connectionString/>
</connectionStrings>
<systemweb>
 <compilation debug=true/>
 <authentication mode=Forms />
</systemweb>
  這些節中的每一個都可以有選擇地被加密或者通過編程方式或通過aspnet_regiisexe(一個命令行工具)實現當被加密時加密後的文本直接存儲在配置文件中例如如果我們要加密上面的<connectionStrings>節那麼結果nfig文件可能看起來如下所示(注意篇幅所限我們省略了一大塊<CipherValue>)

<?xml version=?>
<configuration xmlns=
<connectionStrings configProtectionProvider=DataProtectionConfigurationProvider
<EncryptedData>
 <CipherData>
  <CipherValue>AQAAANCMndBFdERjHoAwE/Cl+sBAAAAedGicAlQ==</CipherValue>
 </CipherData>
</EncryptedData>
</connectionStrings>
<systemweb>
 <compilation debug=true/>
 <authentication mode=Forms />
</systemweb>

  另外存在一些你不能使用這個技術加密的配置部分

  · <processModel>
  · <runtime>
  · <mscorlib>
  · <startup>
  · <systemruntimeremoting>
  · <configProtectedData>
  · <satelliteassemblies>
  · <cryptographySettings>
  · <cryptoNameMapping>
  · <cryptoClasses>

  為了加密這些配置部分你必須加密這些值並把它存儲在注冊表中存在一個aspnet_setregexe命令行工具可以幫助你實現這一過程我們將在本文後面討論這個工具

  【提示】WebConfig和MachineConfig之區別

  nfig文件指定針對一個特定的web應用程序的配置設置並且位於應用程序的根目錄下而nfig文件指定所有的位於該web服務器上的站點的配置設置並且位於$WINDOWSDIR$\MicrosoftNet\Framework\Version\CONFIG目錄下

   

  加密選項

  開發人員可以使用ASPNET 提供程序模型來保護配置節信息這允許任何實現都可以被無縫地插入到該API中NET框架中提供了兩個內置的提供程序用於保護配置節信息

  · Windows數據保護API(DPAPI)提供程序(DataProtectionConfigurationProvider)這個提供程序使用Windows內置的密碼學技術來加解密配置節默認情況下這個提供程序使用本機的密鑰你還能夠使用用戶密鑰但是這要求進行一點定制

  · RSA保護的配置提供程序(RSAProtectedConfigurationProvider)使用RSA公鑰加密來加解密配置節使用這個提供程序你需要創建存儲用於加解密配置信息的公鑰和私鑰的密鑰容器你能夠在一個多服務器場所下使用RSA這只要創建可輸出的密鑰容器即可
當然如果需要的話你還能夠創建自己的保護設置提供程序

  在本文中我們僅討論使用DPAPI提供程序使用機器級密鑰到目前為止這是最簡單的方法因為它不請求創建任何密鑰或密鑰容器當然其消極的一面在於一個加密的配置文件僅能夠用於首先實現加密的web服務器上而且使用機器密鑰將允許加密的文本能夠被web服務器上的任何網站所解密

  以編程方式加密配置部分

  SystemConfigurationSectionInformation類對一個配置節的描述進行了抽象為了加密一個配置節只需要簡單地使用SectionInformation類的ProtectSection(提供程序)方法傳遞你想使用的提供程序的名字來執行加密為了存取你的應用程序的nfig文件中的一個特定的配置節你可以使用WebConfigurationManager類(在SystemWebConfiguration命名空間中)來引用你的nfig文件然後使用它的GetSection(sectionName)方法返回一個ConfigurationSection實例最後你可以經由ConfigurationSection實例的SectionInformation屬性得到一個SectionInformation對象

  下面我們通過一個簡單的代碼示例來說明問題

   privatevoid ProtectSection(string sectionName string provider)
{
 Configuration config = WebConfigurationManager
 OpenWebConfiguration(RequestApplicationPath);
 ConfigurationSection section = configGetSection(sectionName);
 if (section != null &&!sectionSectionInformationIsProtected)
 {
  sectionSectionInformationProtectSection(provider);
  configSave();
 }
}
private void UnProtectSection(string sectionName) {
 Configuration config =WebConfigurationManagerOpenWebConfiguration(RequestApplicationPath);
 ConfigurationSection section = configGetSectio n(sectionName);
 if (section != null && sectionSectionInformationIsProtected)
 {
  sectionSectionInformationUnprotectSection();
  configSave();
 }

  你可以從一個ASPNET頁面中調用這個ProtectSection(sectionNameprovider)方法其相應的參數是一個節名(如connectionStrings)和一個提供程序(如DataProtectionConfigurationProvider)並且它打開nfig文件引用該節調用SectionInformation對象的ProtectSection(provider)方法最後保存配置變化

  另一方面UnProtectSection(provider)方法實現解密一個特定的配置節在此僅需要傳入要解密的節我們不需要麻煩提供程序因為該信息已經存儲在伴隨encrypted節的標記中(也即是在上面的示例中的<connectionStrings>節在被加密以後它包含了提供程序<connectionStringsconfigProtectionProvider=DataProtectionConfigurationProvider>)

  記住一旦該數據被加密當從一個ASPNET頁面讀取它時(也即是從一個SqlDataSource控件或以編程方式經由ConfigurationManagerConnectionStrings[connStringName]ConnectionString讀取該連接字符串信息)ASPNET會自動地解密該連接字符串並且返回普通文本值換句話說在實現加密後你一點不需要改變你的代碼相當酷對不對?

  從本文下載的示例ASPNET 網站中你會發現有一個示例頁面它展示了該站點的nfig文件其中有一個多行TextBox還提供了相應的Web控件按鈕用於加密配置文件的各個部分這個示例中也使用了上面已經討論過的ProtectSection()和UnProtectSection()方法

   

   使用命令行工具aspnet_regiisexe

  你還能夠使用aspnet_regiisexe命令行工具來加密和解密nfig文件配置部分你可以在%WINDOWSDIR%\MicrosoftNet\Framework\version目錄下找到這個工具為了加密nfig文件中的一個節你可以在這個命令行工具中使用DPAPI機器密鑰如下所示

  加密一個特定網站的nfig文件的通用形式

   aspnet_regiisexe pef section physical_directory prov provider

  或

   aspnet_regiisexe pe section app virtual_directory prov provider

  加密一個特定網站的nfig文件的具體實例

   aspnet_regiisexe pef connectionStrings C:\Inetpub\wwwroot\MySite prov DataProtectionConfigurationProvider

  或

   aspnet_regiisexe pe connectionStrings app /MySite prov DataProtectionConfigurationProvider

  解密一個特定網站的nfig文件的通用形式

   aspnet_regiisexe pdf section physical_directory

  或

   aspnet_regiisexe pd section app virtual_directory

  解密一個特定網站的nfig文件的具體實例

   aspnet_regiisexe pdf connectionStrings C:\Inetpub\wwwroot\MySite

  或

  你還能夠指定由aspnet_regiisexe來執行nfig文件的加密/解密

  【提示】 加密ASPNET版本x中的配置設置

  為了保護ASPNET版本x中的配置設置開發者需要加密並把敏感的設置存儲在web服務器的注冊表中並以一種鍵方式存儲配置文件中不是存儲加密的內容(如ASPNET 那樣)而只是包含一個到存儲該加密值的注冊表鍵的引用例如

   <identity impersonate=true
userName=registry:HKLM\SOFTWARE\MY_SECURE_APP\identity\ASPNET_SETREGuserName
password=registry:HKLM\SOFTWARE\MY_SECURE_APP\identity\ASPNET_SETREGpassword />

  微軟為開發人員提供了aspnet_setregexe命令行工具用於加密敏感的配置信息並且把它移動到一個注冊表入口處遺憾的是這個工具僅針對特定的配置設置工作相比之下ASPNET 允許加密任何配置節

  有關於在一個ASPNET x應用程序中使用aspnet_setregexe的更多信息請參考MSDN中的KB#遺憾的是這個命令行程序僅能加密配置設置中的預定義的節並且不允許你加密你自己添加的數據庫連接字符串和其它敏感信息

   結論

  在本文中我們學習了如何使用ASPNET 提供的不同的加密選項來保護配置節信息還討論了如何使用編程技術和aspnet_regiisexe來分別加密nfig中的配置節保護你的敏感的配置設置有助於確保你的站點更難於被黑客攻擊通過使其更難於發現敏感的配置設置如今ASPNET 已經提供了相對容易的加密和解密技術開發者毫無理由不使用這種方式來保護你的敏感的配置設置


From:http://tw.wingwit.com/Article/program/net/201311/12440.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.