1. 程式人生 > >配置檔案(Web.Config)加密解密詳細說明

配置檔案(Web.Config)加密解密詳細說明

配置檔案webform下是web.config,winform下是app.config,如果要加密app.config,先把它改名為:web.config,加密後再重新改回原名就可以了

開啟SDK命令提示執行以下命令:開始-->所有程式-->Microsoft .NET Framework SDK v2.0-->SDK命令提示

加密:aspnet_regiis -pef "配置節" "目錄"

解密:aspnet_regiis -pdf "配置節" "目錄"

如:aspnet_regiis -pef "appSettings" "C:/Inetpub/wwwroot/hr512"

加密C:/Inetpub/wwwroot/hr512/web.config中設定的appSettings節點中的內容

讀取節點值和未加密前相同,.net會自動解密

如果出現以下錯誤資訊:

未能使用提供程式“RsaProtectedConfigurationProvider”進行解密。提供程式返回錯誤訊息為: 打不開 RSA 金鑰容器。

解決方法:

在SDK命令下執行:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"

================================================================================

如果想對web.config的資料庫連線字串進行加密的話,這裡提供了兩個方法:

方法一 
使用“DataProtectionConfigurationProvider”形式加密。

建立test.aspx檔案,程式碼如下:

 


總結:此方法很方便,並且很簡單,但安全性沒有金鑰加密高。

方法二
使用“RSAProtectedConfigurationProvider”形式來加密
test.aspx程式檔案基本如上,
把section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
改成section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
但這個時候你訪問網站的時候很有可能會出現

說明: 在處理向該請求提供服務所需的配置檔案時出錯。請檢查下面的特定錯誤詳細資訊並適當地修改配置檔案。
分析器錯誤資訊: 未能使用提供程式“RsaProtectedConfigurationProvider”進行解密。提供程式返回錯誤資訊為: 打不開 RSA 金鑰容器。

這樣的錯誤,解決方法是:
進dos執行:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
如果執行出錯,需要把目錄 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727 放入環境變數path中。
此時就可以成功訪問網站了。
同樣可以通過命令列來實現“RSAProtectedConfigurationProvider”加密。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

您可能會出現的問題:

一:分析器錯誤資訊: 未能使用提供程式“DataProtectionConfigurationProvider”進行解密。提供程式返回錯誤資訊為: 該項不適於在指定狀態下使用。

二:未能使用提供程式“RsaProtectedConfigurationProvider”進行解密。提供程式返回錯誤訊息為: 打不開 RSA 金鑰容器。

解決辦法:(請耐心看完,你一定會找到問題所在的。)

 

上面這段文字的重心:

      既然是 key 檔案都與本地計算機相關了,那相對路徑自然意義就不大了(不敢說絕對沒有意義).  key 檔案無法直接複製到其他機器上的原因是對這個金鑰檔案又使用 DPAPI (Windows 資料保護) 進行加密。使用了 DPAPI 進行加密的資料只能在特定的計算機上使用,換個機器當然就不行了!因為你加密的時候使用了當前計算機和登陸到該計算機的使用者的資訊。

      所以順便提一點:產生 key 檔案的過程中有個選擇項, 一個是使用者模式,一個是機器模式。使用者模式是登陸到該計算機的使用者才能使用這個 key檔案,機器模式當然就是隻要是這個計算機上的使用者都可以使用這個 key 檔案。比如部署 WebForms 的WebSite 需要使用機器模式,至於WinForms的部署,如果不能確認計算機上只有一個帳戶會使用你部署的軟體,還是使用機器模式吧!

      針對第一個問題的解決方案:

      如果想將一個配置檔案(比如web.config, App.config)在一臺計算機加密後,在其他計算機上都能使用,就達到了我們的目的。

      說到對配置檔案加密,自然要提到它們兩個:

      DPAPIProtectedConfigurationProvider。使用 Windows 資料保護 API (DPAPI)對資料進行加密和解密。

      RsaProtectedConfigurationProvider。使用 RSA 加密演算法對資料進行加密和解密。

      這兩個提供程式都提供對資料的強加密;但是,如果打算在多臺計算機上使用同一個加密配置檔案,則只有使用RsaProtectedConfigurationProvider。因為這個才能匯出用於對資料進行加密的加密金鑰,並在另一臺計算機上匯入它們。

      我們使用配置工具對配置檔案的配置區進行加密時可以指定哪個ProtectedConfigurationProvider。很顯然,在解決這個問題上,我們只能使用 RsaProtectedConfigurationProvider。由於不同的計算機上RSA金鑰容器是各不相同的,所以我們需要從一臺計算機上匯出一個RSA 金鑰容器,然後匯入其他計算機上!由於匯入方式是可以用 DOS 命令實現,所以在部署上不存在問題!另外,由於.NET Framework 有個預設的RSA金鑰容器,名稱為 "NetFrameworkConfigurationKey" ,在machine.config檔案可以看到這個預設的引數。
 
        先提示以下:aspnet_regiis.exe 在 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727 下。C 盤是我的安裝路徑。所以使用 DOS 命令要注意路徑。(可以通過 開始選單 -> 所有程式 -> Microsoft Visual Studio 2005 -> Visual Studio Tools -> Visual Studio 2005 命令提示 來開啟使用 aspnet_regiis 命令的 cmd 介面。)

(如果您找不到Visual Studio 2005 命令提示,則說明您沒有安裝完全)

步驟如下:

(1):在當前計算機上,匯出 RSA金鑰容器。(可以在匯出檔案前指定路徑。)

           aspnet_regiis -px "NetFrameworkConfigurationKey" D:/RSAkeys.xml -pri

(2):在當前計算機上,用企業庫工具加密配置檔案。ProtectedConfigurationProvider 只能選擇

           RsaProtectedConfigurationProvider。

(3):在部署的計算機上, 匯入名為 "NetFrameworkConfigurationKey" 的 RSA 金鑰容器。

           aspnet_regiis -pi "NetFrameworkConfigurationKey" D:/RSAkeys.xml

(1)和(2)可以在當前計算機直接操作,(3)的 DOS 命令可以在部署時由程式中完成。

這樣就完成了!

        提示一下:有可能步驟(1)匯出失敗,它不能使用 -pri 這個引數,而這個引數是匯出解密使用的資訊!如果沒有它,在其他機器上只能加密新的東西。那麼解決方法如下:

        (1)在當前計算機上, 建立新的 RSA 金鑰容器,它的名稱為: CustomKeys 。(這裡有個使用者級別和計算機級別的,下面的方式是建立計算機級別的,名字按照你的要求取)

        aspnet_regiis -pc "CustomKeys" -exp


        (2) 在當前計算機上, 向帳戶授予訪問許可權

        aspnet_regiis -pa "CustomKeys" "NT AUTHORITY/NETWORK SERVICE"

        其他需要訪問許可權的帳戶也應該被授權。

        (3)在當前計算機上,匯出 RSA金鑰容器。(可以在匯出檔案前指定路徑。)

        aspnet_regiis -px "CustomKeys" D:/RSAkeys.xml -pri


        (4)在當前計算機上,將machine.config (在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG) 中 keyContainerName = "NetFrameworkConfigurationKey"  替換為我們新建立的名稱:keyContainerName  = "CustomKeys"。

        (5)在當前計算機上,用企業庫工具加密配置檔案。ProtectedConfigurationProvider只能選擇 RsaProtectedConfigurationProvider。

        (6)在部署的計算機上, 匯入名為 "NetFrameworkConfigurationKey" 的 RSA 金鑰容器。

        aspnet_regiis -pi "NetFrameworkConfigurationKey" D:/RSAkeys.xml


        順便提一下刪除 RSA金鑰容器 的命令:

        aspnet_regiis -pz "CustomKeys"

        當你輸入一個錯誤的命令,會顯示幫助命令資訊。另外提示: 以上命令如果使用複製的方式,一定要注意檢查下劃線和空格的位置!