2011-09-06 56 views
8

代碼是ConfigurationManage - > section.SectionInformation.ProtectSection()是否依賴於機器?

Configuration config = ConfigurationManager.OpenExeConfiguration (Application.ExecutablePath); 
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection; 
if (!section.SectionInformation.IsProtected) 
{ 
    section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); 
} 

I'm得到了一些麻煩,當我將應用程序移到另一臺機器。

是Section.SectionInformation.ProtectSection調用機器的依賴,意思是說,我不能複製配置文件並在另一臺機器上使用它?

是否有一個提供者(除了DataProtectionConfigurationProvider)是機器獨立的?

這是我的應用程序的要求,它可以在具有相同配置文件的多臺機器上運行(它必須從閃存驅動器運行)。

感謝, 法比奧

回答

10

是在section.SectionInformation.ProtectSection呼叫機依賴,這意味着,我不能複製配置文件,並使用另一臺機器上?

是的,就我所知,這是正確的。 This article表示密鑰存儲在每臺機器或每個用戶的基礎上。

是否存在機器獨立的提供者(除了DataProtectionConfigurationProvider)?

不開箱,兩個供應商,我知道的(DataProtectionConfigurationProviderRSAProtectedConfigurationProvider)都具有相同的「問題」。我發現了一些提示,RSA提供者允許在機器間重用密鑰,但還沒有找到任何有關如何實現這個目的的例子。

但是,有一種方法可以實現您的需要,我自己昨天自己做了一個類似的問題(我有一個要求從網絡位置運行應用程序,所有客戶端都需要共享加密配置文件)。你可以推出自己的ProtectedConfigurationProvider。下面是說明該概念的幾個環節:

使用這些文章,我是能夠建立自己的ProtectedConfigurationProvider沒有被機器或用戶依賴並在應用程序中使用它。我在發佈版本中有一個後期構建步驟,可以保護配置部分,因此我只部署它的受保護版本。獲取受保護的部分數據的方式與其他機器所期望的一樣,沒有任何問題。當然,你必須非常小心如何安全地加密和解密你的部分。有幾個例子概述瞭如何做到這一點,this是我認爲的其中之一。

在這三篇文章中沒有明確指出的一件事是如何讓你的應用程序找到你的提供者,如果你不使用ASP.net。將它安裝到全局程序集緩存中的常用方式可能不適用於您,因爲您聲明您正在從閃存驅動器運行應用程序。所以,你需要把它添加到您的app.config文件,而不是,與此類似:

<?xml version="1.0"?> 
<configuration> 
    ... 
    <configProtectedData defaultProvider="MyEncryptionProvider"> 
    <providers> 
     <add name="MyEncryptionProvider" 
     type="MyAssembly.MyEncryptionProvider, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=whatever_the_assembly_token_is" /> 
    </providers> 
    </configProtectedData> 
    ... 
</configuration> 

這應該工作如果這樣做的加密組件在爲你的主要裝配相同的路徑。我正在使用簽名程序集,sn -T {Assembly}會爲您提供需要在配置文件中輸入的PublicKeyToken。

保護一個部分,然後做與此類似:

using System.Configuration; 

... 

Configuration oConfiguration = ConfigurationManager.OpenExeConfiguration(yourExePath); 
oSection.SectionInformation.ProtectSection("MyEncryptionProvider"); 
oSection.SectionInformation.ForceSave = true; 
oConfiguration.Save(); 

我今天測試了它,並將它與配置文件在開發計算機(XP SP3)上的加密工作,並在XP SP2使用,Win7 32Bit和Win7 64Bit。

免責聲明

  • 不知道,如果你不簽上你的組件任何的工作原理。
  • 使用需要您自擔風險,我不是任何標準的安全專家。
+0

Takrl,太棒了。非常感謝你。我會讓你知道它是怎麼回事。 – Fabio

+0

@Fabio當然,讓我知道如果您有任何問題... – takrl

+0

嗨,夥計們,我遇到了與我的自定義受保護的配置提供程序加密配置的問題。當我調用section.SectionInformation.ProtectSection(「AesProvider」)時,它給了我錯誤,「保護提供者'AesProvider'沒有找到。」看起來,當你使用ProtectedConfiguration.Providers時,它被加載,但它使用了我不能用來加密其他一些配置文件的程序配置。你有這樣的經歷嗎? – flynhigh