天天看點

輕松加密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>)

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">

<EncryptedData>

 <CipherData>

  <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>

 </CipherData>

</EncryptedData>

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

  · <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目錄下

本文轉自朱先忠老師51CTO部落格,原文連結:http://blog.51cto.com/zhuxianzhong/59697 ,如需轉載請自行聯系原作者

繼續閱讀