0

Я новичок в этом, поэтому, пожалуйста, несите меня. Я пытаюсь зашифровать/расшифровать раздел .config, используя RsaProtectedConfigurationProviderProtectedConfigurationProvider с использованием сертификата Rsa и x509

Пожалуйста, поправьте меня, если я ошибаюсь, но от того, что я читал, что нужно сделать следующее:

  1. Получить сертификат и открытый ключ из этого сертификата

    X509Certificate2 cert = new X509Certificate2(pathToCert, "password"); 
    RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider; 
    
  2. нагрузки этой информации для контейнера: не знаю, как это сделать, как образец ниже не учитывает свидетельства s

http://msdn.microsoft.com/en-us/library/tswxhw92(en-us,VS.80).aspx

// Create the CspParameters object and set the key container 
    // name used to store the RSA key pair. 
    CspParameters cp = new CspParameters(); 
    cp.KeyContainerName = "MySuperAwesomeKeyContainer"; 

    // Create a new instance of RSACryptoServiceProvider that accesses 
    // the key container MyKeyContainerName. 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 
  1. Тогда имеют такое же имя контейнера, указанного в моем App.Config:
<configProtectedData> 
<providers> 
<clear/> 
    <add name="MyProvider" 
    type="System.Configuration.RsaProtectedConfigurationProvider" 
    keyContainerName="MySuperAwesomeKeyContainer" 
    useMachineContainer="true" /> 
</providers> 
</configProtectedData> 
  1. Тогда просто запустить этот код, который будет использовать этот KeyContainer и зашифровать/расшифровать:
.... 
string provider = "MyProvider"; 
// Protect the section. 
connStrings.SectionInformation.ProtectSection(provider); 

Правильно ли это ?. Если да, то как бы я это сделал? Не знаете, как получить эти ключи из сертификата и загрузить их в KeyContainer.

благодарит

ответ

1

Я сделал это так:

Поставщик реализации:

public class X509ProtectedConfigProvider : ProtectedConfigurationProvider 
{ 
    #region Fields 

    private X509Certificate2 cert; 

    #endregion 

    // Performs provider initialization. 
    #region Public Methods and Operators 

    public override XmlNode Decrypt(XmlNode encryptedNode) 
    { 
     // Load config section to encrypt into xmlDocument instance 
     XmlDocument doc = encryptedNode.OwnerDocument; 
     EncryptedXml eXml = new EncryptedXml(doc); 

     eXml.DecryptDocument(); 
     return doc.DocumentElement; 
    } 

    public override XmlNode Encrypt(XmlNode node) 
    { 
     // Load config section to encrypt into xmlDocument instance 
     XmlDocument doc = new XmlDocument { PreserveWhitespace = true }; 
     doc.LoadXml(node.OuterXml); 

     // Encrypt it 
     EncryptedXml eXml = new EncryptedXml(); 
     EncryptedData eData = eXml.Encrypt(doc.DocumentElement, this.cert); 
     return eData.GetXml(); 
    } 

    public override void Initialize(string name, NameValueCollection config) 
    { 
     base.Initialize(name, config); 

     string certSubjectDistName = config["CertSubjectDistinguishedName"]; 
     string certStoreName = config["CertStoreName"]; 

     X509Store certStore = !string.IsNullOrEmpty(certStoreName) ? new X509Store(certStoreName, StoreLocation.LocalMachine) : new X509Store(StoreLocation.LocalMachine); 

     try 
     { 
      certStore.Open(OpenFlags.ReadOnly); 
      X509Certificate2Collection certs = certStore.Certificates.Find(
       X509FindType.FindBySubjectName, certSubjectDistName, true); 

      this.cert = certs.Count > 0 ? certs[0] : null; 
     } 
     finally 
     { 
      certStore.Close(); 
     } 
    } 

    #endregion 
} 

Вспомогательный класс:

public static class Crypto 
    { 
     // Protect the connectionStrings section. 
     #region Public Methods and Operators 

     public static bool ProtectConfiguration(string path) 
     { 
      string provider = "X509ProtectedConfigProvider"; 

      // Get the application configuration file. 
      Configuration config = ConfigurationManager.OpenExeConfiguration(path); 

      // Get the section to protect. 
      ConfigurationSection connStrings = config.ConnectionStrings; 

      if (connStrings != null) 
      { 
       if (!connStrings.SectionInformation.IsProtected) 
       { 
        if (!connStrings.ElementInformation.IsLocked) 
        { 
         // Protect the section. 
         connStrings.SectionInformation.ProtectSection(provider); 

         connStrings.SectionInformation.ForceSave = true; 
         config.Save(ConfigurationSaveMode.Full); 

         return true; 
        } 

        return false; 
       } 

       return true; 
      } 

      return false; 
     } 

     // Unprotect the connectionStrings section. 
     public static void UnProtectConfiguration(string path) 
     { 
      // Get the application configuration file. 
      Configuration config = ConfigurationManager.OpenExeConfiguration(path); 

      // Get the section to unprotect. 
      ConfigurationSection connStrings = config.ConnectionStrings; 

      if (connStrings != null) 
      { 
       if (connStrings.SectionInformation.IsProtected) 
       { 
        if (!connStrings.ElementInformation.IsLocked) 
        { 
         // Unprotect the section. 
         connStrings.SectionInformation.UnprotectSection(); 

         connStrings.SectionInformation.ForceSave = true; 
         config.Save(ConfigurationSaveMode.Full); 
        } 
       } 
      } 
     } 

     #endregion 
    } 
} 

App.Config (заметьте configProtectedData):

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 
    <connectionStrings> 
    <add name="MyDbConnStr" providerName="System.Data.SqlClient" connectionString="Data Source=localhost;Initial Catalog=MyDb;Integrated Security=True;"/> 
    </connectionStrings> 
    <appSettings> 
    <add key="SiteName" value="MyAwesomeSite"/> 
    </appSettings> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> 
    <configProtectedData> 
     <providers> 
      <add CertSubjectDistinguishedName="localhost" CertStoreName="MyCertKeyStore" name="X509ProtectedConfigProvider" type="ProtectedConfigProvider.X509ProtectedConfigProvider, X509ProtectedConfigProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=098027505e2ed139" /> 
     </providers> 
    </configProtectedData> 
</configuration> 

Программа (Использование):

...

ProtectConfiguration("mysuperawesomeapp.exe); 

DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory()); 
Database db = DatabaseFactory.CreateDatabase("MyDbConnStr"); 

Чтение из БД отлично с разделом зашифрованного приложения конфигурации "ConnectionStrings" работает.:)

0

Вы найдете шаги здесь: Walkthrough: Creating and Exporting an RSA Key Container. Вам не нужен сертификат, вы можете напрямую создать контейнер ключей.

Если вы зашифровываете пользовательский раздел конфигурации, есть хитрость, чтобы заставить его работать: вам нужно удалить объявление configSection. Здесь я подробно рассказывал подробности: How to encrypt a custom configuration section in ASP.NET.

Смежные вопросы