簡單的解決方法:web
WebConfig 加解密,未能使用提供程序「RsaProtectedConfigurationProvider」進行解密。提供程序返回錯誤消息爲: 打不開 RSA 密鑰容器。
問題:未添加用於訪問 RSA 密鑰容器
命令:aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY/NETWORK SERVICE"
注意事項:XP下:aspnet_regiis -pa "NetFrameworkConfigurationKey" "aspnet"
加密:aspnet_regiis -pe "appSettings" -app "/應用程序名"
解密:aspnet_regiis -pd "appSettings" -app "/應用程序名" 如(/PetShop/web)docker
更靈活的解決方法:
一、建立一個密鑰容器
aspnet_regiis -pc "ConnectionStringsKey" -exp
ConnectionStringsKey爲密鑰容器的名稱
可使用aspnet_regiis /?查看該命令的用法c#
二、在web.config中加入以下內容安全
- <configProtectedData>
- <providers>
- <clear />
- <add name="ConnectionStringsKeyProvider"
- type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
- keyContainerName="ConnectionStringsKey"
- useMachineContainer="true"/>
- </providers>
- </configProtectedData>
三、經過命令行:用指定的密鑰加密指定目錄下的web.config文件的指定的配置節
aspnet_regiis -pef "connectionStrings" "d:/testproj/websitetest" -prov "ConnectionStringsKeyProvider"
對於子配置節用/分隔表示, 如identity配置節 須要寫成 "system.web/identity"
四、若是訪問web程序,頁面提示 Error message from the provider: The RSA key Container could not be opened.
是因爲network service賬戶沒法訪問密鑰文件形成的。 找到密鑰文件, 賦予network service讀權限。該密鑰文件位於(可按時間排序,找到本身產生的那個密鑰文件)
vista: c:/ProgramData/Microsoft/Crypto/RSA/MachineKeys/
xp或其餘:C:/Documents and Settings/All Users/Application Data/Microsoft/Crypto/RSA/MachineKeys服務器
至此:查看被加密的標記, 內容就已是被加密過的了。app
5.經過.aspx頁面:加密鏈接字符串:界面如圖:ide

後臺代碼: 加密
- protected void Button1_Click(object sender, EventArgs e)
- {
-
- string name = @"connectionStrings";
-
- string appPath = "/loginContral";
- Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath);
-
-
- string provider = "ConnectionStringsKeyProvider";
- config.GetSection(name).SectionInformation.ProtectSection(provider);
-
-
- try
- {
- config.Save();
- }
- catch (Exception ex)
- {
- Response.Write(ex.Message);
- }
- if (config.GetSection(name).SectionInformation.IsProtected)
- {
- Button1.Enabled = false;
- Response.Write("加密成功!");
- }
- else
- {
- Response.Write("加密失敗!");
- }
- }
-
-
- protected void Button2_Click(object sender, EventArgs e)
- {
-
- string name = @"connectionStrings";
-
-
- string appPath = "/loginContral";
- Configuration config = WebConfigurationManager.OpenWebConfiguration(appPath);
-
-
-
- config.GetSection(name).SectionInformation.UnprotectSection();
-
-
- config.Save();
-
- if (config.GetSection(name).SectionInformation.IsProtected==false)
- {
- Button2.Enabled = false;
- Response.Write("解密成功!");
- }
- else
- {
- Response.Write("解密失敗!");
- }
- }
注意:string appPath = "/loginContral" 爲當前項目路徑; spa

加密前的鏈接字符串:.net
- <connectionStrings>
- <add name="connection" connectionString="data source=.;database=aspnetdb;user id=sa;pwd=123;" />
- </connectionStrings>
加密後的鏈接字符串:
- <connectionStrings configProtectionProvider="ConnectionStringsKeyProvider">
- <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
- xmlns="http://www.w3.org/2001/04/xmlenc#">
- <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
- <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
- <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
- <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
- <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
- <KeyName>Rsa Key</KeyName>
- </KeyInfo>
- <CipherData>
- <CipherValue>AepogG4vVhd8K6NVhVmdO8FAGFMopOdDvnBN5vPV0mxP8NgrImnZFvflrhhvooiu56McmMr6n5cUnixzimGB/zTgCNMsIkU8Sr6YtX8iUh64U9IVujwaOAbtZp4AhLhMiH6YwkHXjmqrjYyS2ecsocquZQ0ndkKC3OMg/UcOIk0=</CipherValue>
- </CipherData>
- </EncryptedKey>
- </KeyInfo>
- <CipherData>
- <CipherValue>biMAH/6vwvi0FKvqijpSZzKhk+a6QNi0Aa794yxi1X+sffKdtsUR15hVcByOlborcKPRhX94MpOm2eKoBqYVyCf24PdYAkIFFAzO1sluzmUtcXFVU/lTBqn83bnJDgBgo6eVtDg4m7DSAVR6qWyEP8wySqWWuBkWSLzsMynqPOyGhVB9bTVJbSCWiUZ4ynFhvUTziGISJQA=</CipherValue>
- </CipherData>
- </EncryptedData>
- </connectionStrings>
其餘備用操做:
一、解密web.config
aspnet_regiis -pdf "connectionStrings" "d:/testproj/websitetest"
二、把密鑰容器導出爲xml文件
aspnet_regiis -px "ConnectionStringsKey" "c:/Key.xml" 。這個命令只導出公鑰,所以之後只能用於加密,而沒法解密。
aspnet_regiis -px "ConnectionStringsKey" "c:/Keys.xml" -pri 這個則連私鑰一塊兒導出了,因此咱們要用這個。
三、把密鑰容器刪除
aspnet_regiis -pz "LixinKey" 刪除後再運行程序,會提示出錯:
分析器錯誤信息: 未能使用提供程序「LixinKeyProvider」進行解密。提供程序返回錯誤信息爲: 打不開 RSA 密鑰容器。
同理能夠證實,在任何一臺未安裝正確的密鑰容器LixinKey的機器上,程序都沒法對connectionStrings節進行解密,所以也就無 法正常運行。
四、導入key.xml文件
aspnet_regiis -pi "LixinKey" "c:/Keys.xml"
此時,再運行程序會發現又能夠解密了。證實加密與解密機制運行正常。
最後說一下這個機制所提供的安全性保障能夠運用在什麼方面: 1. 對winform程序的app.config進行加密實際意義並不大,由於不管如何,客戶機均可以經過運行aspnet_regiis -pdf 來對配置文件進行解密,從而暴露敏感信息。 2. 對於web.config進行加密的意義也僅限於,當web.config文件不當心泄露時,不會同時泄露敏感信息,若是惡意攻擊者已經取得了在服務器上運行程序的權限,那麼同app.config同樣,能夠很容易經過經過運行aspnet_regiis -pdf 獲取明文了。3. 還有,經過aspnet_regiis -pa "Key" "NT AUTHORITY/NETWORK SERVICE"控制對不一樣用戶對密鑰容器的訪問權限,應該還能夠進一步獲取一些安全性,好比能夠控制某些用戶即便登陸到服務器上,也沒法用aspnet_regiis -pdf對配置文件進行解密。