ASP.NET 2.0 筆記:加密組態檔
資料來源: http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3226.aspx
準備工作
先在 Visual Studio 2005 中建立一個 Web Site,假設建立在 D:\Work\Demo\EncryptWebConfig。接著在 web.config 中加入 appSetting 設定,參考以下範例:
加密組態檔
加密的方法是利用 .NET Framework 提供的命令列工具:aspnet_regiis.exe。首先,開啟程式集 > Microsoft .NET Framework SDK v2.0 > SDK Command Prompt,接著輸入以下命令:
aspnet_regiis -pef appSettings D:\Work\Demo\EncryptWebConfig
aspnet_regiis 的 -pef 參數是用來加密某個絕對路徑下的 web.config 的某個 section,因此除了指定要加密的區段(此例為 appSettings),還要指定網站的絕對路徑 (此例為 D:\Work\Demo\EncryptWebConfig)。
如果加密成功,會出現以下訊息:
Encrypting configuration section... Succeeded!
接著回到 Visual Studio 2005,檢視 web.config,原本的 元素的內容會變成類似下面這樣:
>configProtectionProvider="RsaProtectedConfigurationProvider"
這樣就完成加密的工作了。接下來看看如何在程式中讀取加密過的資料。
在程式中讀取加密過的組態
在程式中讀取加密過的組態設定資料,程式撰寫方式跟平常一樣。例如:
string s = ConfigurationManager.AppSettings["mySecret"];
我們完全不需要自行撰寫解密的程式碼,因為 .NET Framework 類別已經在背後幫我們自動處理掉解密的工作了。
解密組態檔
如果要將之前加密過的組態檔內容還原成加密之前的資料,可以使用 aspnet_regiis -pdf 命令,例如:
aspnet_regiis -pdf appSettings D:\Work\Demo\EncryptWebConfig
此外,你可以重複執行同一個加密或解密的命令。對一個加密過的區段再次加密,只會將原始資料重新加密,而不會將加密後的資料再重複加密一次;而對一個解密過的資料重複進行解密動作,也不會有任何影響。
aspnet_regiis 的其他加密參數
-pe 與 -pd 參數
在前面的簡單示範中,筆者使用的是 -pef 參數,此參數必須指定一個加密的區段名稱,以及要加密的網站的絕對路徑。你還可以使用 -pe 參數來加密組態檔,使用此參數時,通常會搭配 -app 參數來指定虛擬目錄的名稱,例如:
aspnet_regiis -pe appSettings -app /MyWeb
如果 -app 之後所指定的虛擬目錄是 '/',則會加密 IIS 網站的根目錄底下的 web.config。如果你沒有指定 -app 參數,那就會加密 .NET Framework 安裝目錄下的 CONFIG\web.config。
與 -pe 參數對應的解密參數就是 -pd,用法與 -pe 參數相同。
-prov 參數
在前面的範例當中,加密後的 appSettings 元素有一個 configProtectionProvider 屬性:
>configProtectionProvider="RsaProtectedConfigurationProvider"
這個屬性的用途是指定加密的提供者,從它的屬性值可以看出,這個提供者所使用的加密演算法是 RSA。你也可以使用 -prov 參數來指定使用其他的提供者,例如 DPAPI (Data Protection Application Programming Interface) ,參考以下範例:
aspnet_regiis -pef appSettings D:\Work\Demo\EncryptWebConfig -prov DataProtectionConfigurationProvider
使用 DPAPI 加密後的組態檔內容如下:
AQAAANCMnd8BF(略...)
若沒有指定 -prov 參數,預設就會使用 RSA 進行加密。
結語
本文簡單介紹了 ASP.NET 2.0 加密 web.config 的方法,以往開發人員必須自行撰寫加密解密的程式碼,現在只要使用 aspnet_regiis 這個命令列工具,執行一行命令就完成加密動作了。更棒的是,在程式中讀取加密過的資料完全不需要撰寫額外的程式碼,這些解密的過程都由 .NET Framework 類別幫我們在背後處理掉了。
另外,本文也提到了 RSA 和 DPAPI 兩種加密方式。根據 MSDN 文件的說明,如果你的網站會部署到多台伺服器上面以同時服務不同的用戶端,也就所謂的 Web farm 架構,那麼你應該要採用 RSA 的加密方式,因為這種方式可以讓你很容易的在多台伺服器之間匯出和匯入 RSA 金鑰(所有 Web farm 機器都要用同一把鑰匙,否則解密會有問題),若用 DPAPI 則很難確保所有機器都用同一把鑰匙。如果想要進一步了解 RSA 加密的應用,以及其他跟組態檔加密有關的議題,可以參考以下文章:
web.config 加密
http://blog.xuite.net/sugopili/computerblog/83661629-web.config+%E5%8A%A0%E5%AF%86
在 ASP.NET 2.0網頁程式中儲存敏感資訊的其中一個主要位置是 web.config檔,為了協助保護組態檔中的資訊,ASP.NET提供『受保護的組態』功能,該功能可讓您加密組態檔中的敏感資訊,而程式撰寫方式跟平常一樣,當要求網頁時,.NET Framework會解密連接字串資訊讓網頁程式使用。
aspnet_regiis.exe預設使用 RSA加密演算法對 web.config檔進行加密或解密資料,而加密金鑰儲存在『RSA金鑰容器』中,所以每台電腦有自己的加密金鑰,除非有匯入 RSA金鑰容器的私密金鑰,否則已加密 web.config檔只能給對 web.config檔進行加密的那台電腦使用。
對 web.config加密步驟:
1. 在命令提示字元中,輸入下列命令,將目錄變更為 .NET Framework 2.0版目錄:
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
1. 在命令提示字元中,輸入下列命令,將目錄變更為 .NET Framework 2.0版目錄:
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
2. 假設網站根目錄是 D:\XXX\YYY,則執行下列指令:
aspnet_regiis.exe -pef connectionStrings D:\XXX\YYY
對 D:\XXX\YYY\web.config檔的『connectionStrings』項目進行加密。
aspnet_regiis.exe -pef connectionStrings D:\XXX\YYY
對 D:\XXX\YYY\web.config檔的『connectionStrings』項目進行加密。
3. 授與 RSA金鑰容器的存取權限
在 ASP.NET對 web.config檔進行解密之前,ASP.NET應用程式的識別(Identity)必須擁有 RSA金鑰容器的讀取權。
在 Microsoft Windows 2000和 Windows XP Professional系統下,ASP.NET背景工作處理序的識別就是本機 ASPNET(ASP.NET Machine Account)帳戶,而 Windows Server 2003系統,預設為 NETWORK SERVICE帳戶。
在 ASP.NET對 web.config檔進行解密之前,ASP.NET應用程式的識別(Identity)必須擁有 RSA金鑰容器的讀取權。
在 Microsoft Windows 2000和 Windows XP Professional系統下,ASP.NET背景工作處理序的識別就是本機 ASPNET(ASP.NET Machine Account)帳戶,而 Windows Server 2003系統,預設為 NETWORK SERVICE帳戶。
Windows Server 2003系統下,其指令為
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
XP系統下(IIS 5.1),其指令為
aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
如果沒有授與存取權限,則會出現以下錯誤訊息:
剖析器錯誤訊息: 無法使用提供者 'RsaProtectedConfigurationProvider' 解密。 來自這個提供者的錯誤訊息為: 無法開啟 RSA 金鑰容器。
剖析器錯誤訊息: 無法使用提供者 'RsaProtectedConfigurationProvider' 解密。 來自這個提供者的錯誤訊息為: 無法開啟 RSA 金鑰容器。
參考資料:
1. 使用受保護的組態加密組態資訊
1. 使用受保護的組態加密組態資訊
沒有留言:
張貼留言