2016-05-10 6 views
3

In meiner Konfigurationsdatei habe ich einige vertrauliche Informationen, die ich für mehr Sicherheit verschlüsseln wollte.So verschlüsseln/entschlüsseln Sie einen Konfigurationsdateiabschnitt mit RsaProtectedConfigurationProvider

Dies ist mein Code (wie erwartet):

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> 

Die .config verschlüsselt sieht wie folgt aus:

<?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> 

Ich habe die folgende Fragen: Ist es sicher, informatio zu lassen ns wie

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

in der .config?

Ist es nicht möglich, es mit diesen Informationen zu entschlüsseln? Nachdem die Datei verschlüsselt ist, kann bestätigen, dass Sie ich diese Zeile kommentieren:

EncryptAppSettings("appSettings", configuration); 

Wenn ich versuche, den Benutzernamen Wert zu erhalten, nachdem die Datei mit dieser Linie verschlüsselt ist:

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

i erhalten die entschlüsselter Wert, selbst wenn meine Datei jetzt verschlüsselt ist. Ich verstehe nicht, warum ...

Danke für Ihre Hilfe

Antwort

9

Zuerst müssen Sie verstehen, wie und von welcher Konfiguration Verschlüsselung wirklich Sie schützt. RsaProtectedConfigurationProvider kann private Schlüssel speichern, die für die eigentliche Verschlüsselung an zwei Stellen verwendet werden. Die erste ist

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

Dies ist Ordner zum Speichern von maschinenweiten Tasten. Standardmäßig kann jeder Benutzer auf diesen Ordner zugreifen, aber Sie müssen erhöht sein (als admin ausführen), um Dateien in diesem Ordner zu lesen (ebenfalls standardmäßig).

Zweite möglich Lage ist

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

Diese Benutzerebene Lage - nur bestimmte Benutzer darauf zugreifen können.

Standardmäßig wird RsaProtectedConfigurationProvider Standort auf Maschinenebene verwenden, dies wird von UseMachineContainer Eigentum dieses Anbieters gesteuert. Standardkonfiguration wird in maschinennahen Konfigurationsdatei definiert (unter C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config) und definiert wie folgt aus:

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

Wenn Sie möchten, dass Ihre Abschnitt mit User-Level-Position verschlüsseln, können Sie diese Konfiguration in Ihrer eigenen App außer Kraft setzen können .config Datei (siehe mehr here).

Jetzt, wenn Sie all das wissen, können Sie eine fundierte Entscheidung treffen, ob Sie Ihren Abschnitt verschlüsseln müssen und wenn ja - welchen Standort zu verwenden.

  1. Wenn Sie maschinennahen Lage (Standard) - Ihre applicaton sollte (unter admin) erhöht ausgeführt werden sowohl für die Verschlüsselung und Entschlüsselung Ihrer Seite. Wenn jemand Zugriff auf Ihre Konfigurationsdatei erhält, kann er diese nicht ohne Administratorrechte entschlüsseln. In einigen Umgebungen (insbesondere Unternehmen) kann das Hochfahren ein Problem sein.

  2. Wenn Sie einen Standort auf Benutzerebene verwenden, muss Ihre Anwendung nicht erhöht ausgeführt werden. Nur der Benutzer, dessen verschlüsselter Abschnitt ihn später entschlüsseln kann. Wenn jemand Zugriff auf Ihren Computer unter einem anderen Benutzer erhält (sich eine Unternehmensdomäne vorstellt) und eine Datei stiehlt, kann er sie nicht entschlüsseln.

Sie können entweder vorge verschlüsseln Sie Ihre Abschnitt für bestimmte Benutzer \ Maschine (Tasten, mit denen Abschnitte verschlüsselt sind, können von einer Maschine zur anderen bei Bedarf exportiert werden) oder bei der ersten Ausführung fragen Anwender sensible Daten eingeben (Passwort in die Datenbank als Beispiel) - dann speichern Sie diese Daten in app.config und verschlüsseln Abschnitt.

Warum erhalten Sie automatisch entschlüsselten Wert - das ist, weil es während der Übertragung entschlüsselt wird, wenn möglich. Sie laufen als Admin standardmäßig scheint es (haben Sie Ihre UAC zum Beispiel deaktiviert), so dass Sie auf Schlüssel zugreifen können, die für die Verschlüsselung verwendet wurden und so entschlüsseln können. Wenn Sie ohne Administrator ausgeführt haben, wird eine Ausnahme ausgelöst, wenn Sie versuchen, auf den verschlüsselten Wert zuzugreifen.

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, diese Erklärungen zu schreiben. Ich werde deine Antwort akzeptieren, wenn ich kann (muss ein wenig warten) – FieryA