2016-05-10 9 views
3

私の設定ファイルには、より高度な暗号化が必要な機密情報があります。RsaProtectedConfigurationProviderを使用して設定ファイルのセクションを暗号化/復号化する方法

これは私のコード(作業として期待される)である:暗号化の.configはこのようになります

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="username" value="a2zmenu"/> 
    <add key="password" value="password"/> 
    </appSettings> 
</configuration> 

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
     fileMap.ExeConfigFilename = @"D:\Web_S\Prep\test\test.exe.config"; 
     System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
     string userNameWithoutEncryption = configuration.AppSettings.Settings["username"].Value; 
     EncryptAppSettings("appSettings", configuration); 
    } 

    protected static void EncryptAppSettings(string section, Configuration configuration) 
    {  
     AppSettingsSection objAppsettings = (AppSettingsSection)configuration.GetSection(section); 
     objAppsettings.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider"); 
     objAppsettings.SectionInformation.ForceSave = true; 
     configuration.Save(ConfigurationSaveMode.Modified); 

    } 
} 

の.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="customAppSettings" type="System.Configuration.NameValueSectionHandler" /> 
    </configSections> 
    <appSettings configProtectionProvider="RsaProtectedConfigurationProvider"> 
    <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>09+Lm23xDWWnAZFOagh3NRwp5tzad+3oedvTgoeWqunQBiAfk9UGfGxriZg6snwwANUDzOANZ+wOFUb6qa0Atf 
NgSd6b4FFSKTqzkfLlk+S9GtPSAVrRaLU9 
/Q2Qu7oxoSbhW7NWtengJbEZrFm+GqlLlm08w8Np/y03DMExFeA=</CipherValue> 
      </CipherData> 
     </EncryptedKey> 
     </KeyInfo> 
     <CipherData> 
<CipherValue>qSYRXNEKhbwNodH60c7qoWeKZ2QKVQmizPXVGCgHVZPMQ4F+XDqlZa2OyIin0kEI3j8pCjNL097RlZClgdd 
gPEd61AEw6DXJc43Z98obNFHmXfK9aS67qEtO6E 
T+qCWQq2ZRbfK6xZ6jlfeink35/veUmoxAmDXrkwdrbQVKv98=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
    </appSettings> 
</configuration> 

私が持っています次の質問: 情報を提供することは安全ですか?たとえば、

<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 

などの.config?

これらの情報で復号化できないのですか?ファイルは、この行を使用して暗号化された後、私は、ユーザー名の値を取得しようとすると

EncryptAppSettings("appSettings", configuration); 

:ファイルが暗号化されて したら、私は、この行をコメントできることを確認することができます

string userNameafterEncryption = configuration.AppSettings.Settings["username"].Value; 

私が取得私のファイルが今暗号化されていても復号化された値。私は

は、あなたが設定の暗号化は本当にあなたを保護する方法を、何から理解する必要があなたの助け

答えて

9

まずいただきありがとうございます...理由を理解していません。 RsaProtectedConfigurationProviderは、実際の暗号化に使用される秘密鍵を2か所に格納できます。最初は

C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys 

機械全体のキーを格納するためのフォルダです。デフォルトでは、すべてのユーザーがこのフォルダにアクセスできますが、このフォルダ内のファイルを読み込むには(管理者として実行する)昇格する必要があります(デフォルトで)。

第二の可能な位置は

C:\Documents and Settings\[user name]\Application Data\Microsoft\Crypto\RSA 

これはユーザーレベルの場所である - 特定のユーザのみがアクセスできます。

デフォルトでは、RsaProtectedConfigurationProviderはマシンレベルの場所を使用しますが、これはこのプロバイダのUseMachineContainerによって制御されます。デフォルトの設定は(C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.configにある)マシンレベルの設定ファイルで定義されており、このように定義されています

<add name="RsaProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="NetFrameworkConfigurationKey" cspProviderName="" useMachineContainer="true" useOAEP="false"/> 

あなたはユーザレベルの場所を使用して、あなたのセクションを暗号化したい場合、あなたはあなた自身のアプリでこの設定を上書きすることができます.configファイル(詳細はhereを参照)。

これをすべて知っていれば、セクションを暗号化する必要があるかどうか、また、そうであればどの情報を使用するかを情報に基づいて判断できます。

  1. あなたはマシンレベルの場所(デフォルト)を使用している場合 - あなたのapplicatonは、両方のあなたの部分の暗号化復号化のために(管理下)の上昇を実行する必要があります。誰かがあなたの設定ファイルにアクセスすると、管理者権限を持たずにそのファイルを解読することができなくなります。いくつかの環境(特に企業)では、上昇した状態が問題になることがあります。

  2. ユーザーレベルの場所を使用している場合、あなたのアプリケーションは昇格して実行する必要はありません。セクションを暗号化したユーザーだけが後でそれを解読できます。誰かが別のユーザー(コンピュータのドメインを想像する)の下でコンピュータにアクセスしてファイルを盗むと、そのファイルを復号化することはできません。

することはでき(パスワードまたは最初の実行上の機密データを入力するようユーザーに求めるのいずれか事前に暗号化し、特定のユーザ\マシンのためのあなたの部分を(セクションでは、必要に応じてマシンから別のマシンにエクスポートすることができ、暗号化されているとキー)例としてデータベースに)、そのデータをapp.configとencryptセクションに保存します。

なぜあなたは自動的に復号化された値を取得するのですか?可能な場合は、即座に復号化されるからです。デフォルトでは管理者として実行されています(UACを無効にしておくなど)ので、暗号化に使用された鍵にアクセスして解読することができます。管理者なしで実行した場合、暗号化された値にアクセスしようとすると例外がスローされます。

+0

このような説明を書く時間をいただき、ありがとうございます。私はあなたの答えを受け入れるだろう(少し待たなければならない) – FieryA

関連する問題