一、 簡介
當創建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目錄下。