5

私の構成ファイルには、セキュリティを強化するために暗号化したい機密情報がいくつかあります。

これは私のコードです(期待どおりに動作します):

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>
  <appSettings>
    <add key="username" value="a2zmenu"/>
    <add key="password" value="password"/>
  </appSettings>
</configuration>

暗号化された .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;

ファイルが暗号化されている場合でも、復号化された値を取得します。理由がわかりません...

ご協力ありがとうございました

4

1 に答える 1

21

まず、暗号化が実際にどのように、どの構成から保護するかを理解する必要があります。RsaProtectedConfigurationProvider実際の暗号化に使用される秘密鍵を 2 つの場所に格納できます。最初のものは

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

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

2番目に考えられる場所は

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"/>

ユーザーレベルの場所を使用してセクションを暗号化する場合は、独自の app.config ファイルでこの構成をオーバーライドできます (詳細はこちらを参照)。

以上のことをすべて理解したら、セクションを暗号化する必要があるかどうか、必要な場合はどの場所を使用するかについて十分な情報に基づいた決定を下すことができます。

  1. マシン レベルの場所 (既定) を使用する場合 - アプリケーションは、セクションの暗号化復号化の両方のために、管理者特権で (管理者の下で) 実行する必要があります。誰かがあなたの設定ファイルにアクセスできたとしても、管理者権限がなければ復号化できません。一部の環境 (特に企業) では、管理者特権での実行が問題になる場合があります。

  2. ユーザーレベルの場所を使用する場合 - アプリケーションは管理者特権で実行する必要はありません。セクションを暗号化したユーザーのみが、後でそれを復号化できます。誰かが別のユーザー (会社のドメインを想像してください) であなたのコンピュータにアクセスし、ファイルを盗んだ場合、その人はそれを復号化できません。

特定のユーザー\マシンのセクションを事前に暗号化するか(セクションを暗号化するキーは、必要に応じてあるマシンから別のマシンにエクスポートできます)、または最初の実行時にユーザーに機密データを入力するように依頼できます(例としてデータベースへのパスワード) - 次に、そのデータを app.config に保存し、セクションを暗号化します。

復号化された値を自動的に取得する理由については、可能であればその場で復号化されるためです。デフォルトで管理者として実行しているように見えるため(たとえば、UACを無効にしている)、暗号化に使用されたキーにアクセスして復号化できます。管理者なしで実行した場合、暗号化された値にアクセスしようとすると例外がスローされます。

于 2016-05-12T18:01:57.170 に答える