Amar zaidi Ответов: 4

Шифрование и расшифровка connectionstring


я шифрую свое приложение connectionstring но когда я запускаю приложение которое расшифровывает строку подключения и подключается к моей базе данных строка подключения сохраняется в зашифрованном формате

Что я уже пробовал:

я тренируюсь расшифровывать свою зашифрованную строку подключения , помещенную в app.config, поэтому сначала я зашифровал ее, Тани заменил настоящую на зашифрованную chaine, и она выглядит
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Benificiare.Properties.Settings.LogementConnectionString" connectionString="6uDB/32KxMOEPPO0maQDJ63Adjp7okmRdGd9s67mV5+8v6wiRK8UKWscnJSbQzFZTQCLiHQnZPGC8S6lI5Uw28qgjKLL14bkL8sNaDkwRUZ+bB6GMFelH9OVZpG1p+4T/I1LosmrkHylQKHotPFZg3xq3EwDJOY3rjbgE5mu6ow=" providerName="System.Data.SqlClient"/>
    </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/></startup></configuration>


в моем коде я делаю обратное


Configuration configuration = null;
            string connection = null;
           configuration = ConfigurationManager.OpenExeConfiguration(@".\Myapp.exe");
            connection = ConfigurationManager.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"].ConnectionString;
            string ENC = DecryptString(connection, "KEY");    //decrypte the connection string                   
            configuration.ConnectionStrings.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"].ConnectionString = ENC;


когда я попытаюсь подключиться, у меня будет сообщение indecate, что строка подключения не изменена.

4 Ответов

Рейтинг:
9

Amar zaidi

Финли у меня есть решение и оно работает
Итак, как я уже сказал, Если я зашифрую свою connectionstring в другом месте с помощью функции Encrypt (), то я, но зашифрованный chaine ine место моей connectionstring в приложении.КОНФИГ

<pre><?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Benificiare.Properties.Settings.LogementConnectionString" connectionString="6uDB/32KxMOEPPO0maQDJ63Adjp7okmRdGd9s67mV5+8v6wiRK8UKWscnJSbQzFZTQCLiHQnZPGC8S6lI5Uw28qgjKLL14bkL8sNaDkwRUZ+bB6GMFelH9OVZpG1p+4T/I1LosmrkHylQKHotPFZg3xq3EwDJOY3rjbgE5mu6ow=" providerName="System.Data.SqlClient"/>
    </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/></startup></configuration>


ИМЯ СОЕДИНЕНИЯ-ЭТО
Benificiare.Properties.Settings.LogementConnectionString

и зашифрованные сети является
"Benificiare.Properties.Settings.LogementConnectionString" connectionString="6uDB/32KxMOEPPO0maQDJ63Adjp7okmRdGd9s67mV5+8v6wiRK8UKWscnJSbQzFZTQCLiHQnZPGC8S6lI5Uw28qgjKLL14bkL8sNaDkwRUZ+bB6GMFelH9OVZpG1p+4T/I1LosmrkHylQKHotPFZg3xq3EwDJOY3rjbgE5mu6ow="

когда приложение работает у меня, чтобы расшифровать этот Chaine и использовать расшифровывается как connectionstringg из моего приложения, так что я сделать это
Configuration  configuration = ConfigurationManager.OpenExeConfiguration(@".\Myapp.exe");
            connection = ConfigurationManager.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"].ConnectionString;
            string ENC = DecryptString(connection, "KEY");    //decrypte the connection string                   
            configuration.ConnectionStrings.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"].ConnectionString = ENC; // change the connectionstring of the app with the decrypted one ****** but this variable was in mode readonly so my pb was in this instruction



поэтому то, что я должен сделать, - это изменить последнюю инструкцию с помощью

var settings = ConfigurationManager.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"];
           var field = typeof(ConfigurationElement).GetField( "_bReadOnly", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
           field.SetValue(settings, false);
           settings.ConnectionString = ENC;



и это прекрасно работает


Рейтинг:
2

phil.o

Эта линия:

connection = ConfigurationManager.ConnectionStrings["Myapp.Properties.Settings.LogementConnectionString"].ConnectionString;
ищет соединение с именем Myapp.Properties.Settings.LogementConnectionString.

Но эта линия:
<add name="Benificiare.Properties.Settings.LogementConnectionString" ...
объявляет соединение под именем Benificiare.Properties.Settings.LogementConnectionString.

Либо вы неправильно назвали соединение в XML-файле, либо вы неправильно назвали его, когда пытаетесь извлечь его из своего кода C#. Я удивлен, что этот код не создает исключения во время выполнения, когда вы пытаетесь получить доступ к несуществующей строке подключения.

Ваш лучший вариант здесь-начать использовать свой отладчик^ Отладка-это очень забавная часть работы разработчика, и я горячо призываю вас попробовать ее, поскольку вы даже можете найти ее занимательной.

Поставьте точку останова^ в строке, с которой вы хотите начать отладку, и запустите сеанс отладки (см. ссылку выше для этого).

Мы не можем сделать это для вас, и у нас нет всей необходимой информации. Однако научиться делать это самостоятельно может принести вам немалое удовлетворение.


Amar zaidi

я не думаю, что МИС любое, подключение объявлен правильно, я меняю только слово benificiare на мое приложение, когда я писал сомневаются в
настоящий ПБ-это как измениться
Конфигурационный менеджер.OpenExeConfiguration(@".\Benificiare.exe").Соединительные нити.Текущая конфигурация.Соединительные нити.ConnectionStrings["Benificiare.Свойства.Настройки.LogementConnectionString"].ConnectionString = ENC;

когда я debbug строка ENC становится нулевой и она поддерживает зашифрованный chaine

phil.o

Тогда это и есть то самое DecryptString() метод, который вы должны отлаживать дальше, так как он возвращает нулевое значение. Вы не показали его реализацию в своем примере кода. Но ничего страшного: точно так же, как вы отладили ту часть кода, которую показали, теперь отладьте DecryptString() метод, и получить, почему он возвращает нулевое значение из кодированной строки, полученной из конфигурации.
Edit: я исправил ваш блок кода, чтобы другие участники не были введены в заблуждение опечаткой.

Amar zaidi

я все исправлю

Рейтинг:
2

George Swan

Я думаю, что вы, возможно, немного усложняете ситуацию. Учитывая, что app.config файл вроде этого

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <clear />
    <add name="MyConnection"
     providerName="System.Data.ProviderName"
     connectionString="Tie two pieces of string together" />
  </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
</configuration>


Следующее приложение показывает способ управления шифрованием и дешифрованием. Она основана в основном на эта документация.

using System;
//may need to add reference to System.Configuration
using System.Configuration;
namespace Scratch
{
    class Program
    {
        static void Main(string[] args)
        {
                                        //path to the exe file
            EnsureConnectionIsEncrypted(@".\Scratch.exe");
            //To do:use a text reader to check .\Scratch.exe.config 
            //now has an encrypted connection
            //Note: The App.config file in solution explorer is not changed
            //To retrieve the decrypted string, simply do this:- 
            var connectionString = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
            Console.WriteLine(connectionString);
            Console.ReadLine();
        }
        //The encryption must be enacted on the client machine, 
        //as decryption can only be done by the machine 
        //that performed the encryption
        static void EnsureConnectionIsEncrypted(string exeFileName)
        {
                 Configuration config = ConfigurationManager.
                    OpenExeConfiguration(exeFileName);
                ConnectionStringsSection section =
                    config.GetSection("connectionStrings")
                    as ConnectionStringsSection;
                if (!section.SectionInformation.IsProtected)
                {
                    section.SectionInformation.ProtectSection(
                       "DataProtectionConfigurationProvider");
                    config.Save();
                }
        }
    }
}


После шифрования, то exe.config файл в выходном каталоге будет выглядеть примерно так: CipherValue был усечен.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
    <EncryptedData>
      <CipherData>
        <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl........................</CipherValue>
      </CipherData>
    </EncryptedData>
  </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
</configuration>


Amar zaidi

это работает, но если я попытаюсь развернуть свое приложение на другой машине, оно не сработает

George Swan

Exe-файла.конфигурационный файл на клиентской машине должны быть в незашифрованном виде во время первого запуска приложения. Только машина, которая шифрует строку подключения, может расшифровать ее.

Amar zaidi

и как это может произойти.
поскольку я думаю, что ваше решение лучше моего, я посмотрел некоторые видео-разговоры об экспорте и импорте Ключей с использованием aspnet_regiis, но до сих пор я не применяю его правильно

Рейтинг:
1

Amar zaidi

я отлаживаю его и он работает правильно,
моя идея состоит из двух этапов
1 - я зашифровать строку connectionString я так понимаю, из приложения.конфиг и я его зашифровать, чт с шифрования (функция) после строки, возвращаемой я заменить его с приложением.конфиг строку connectionString .
2 - в мое приложение и когда она загружается у меня, чтобы извлечь строку connectionString в App.конфиг
соединение =

ConfigurationManager.OpenExeConfiguration(@".\Benificiare.exe").ConnectionStrings.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"].ConnectionString;

затем я расшифровываю его

string ENC = DecryptString(connection, "MyPassPhrase");


тогда я должен изменить свою connectionstring

ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).ConnectionStrings.CurrentConfiguration.ConnectionStrings.ConnectionStrings["Benificiare.Properties.Settings.LogementConnectionString"].ConnectionString = ENC;


моей ошибкой был pb времени выполнения (файл был защищен ), поэтому я исправляю его с помощью OpenExeConfiguration(ConfigurationUserLevel.None) Вместо
OpenExeConfiguration(@".\Myapp.exe")