Проблема с производительностью зашифрованного файла app.config

#c# #encryption #c#-4.0 #app-config

#c# #шифрование #c #-4.0 #app-config

Вопрос:

я работаю над приложением, в котором по ряду причин мы решили, что файл app.config должен быть зашифрован. Мы используем SectionInformation.ProtectSection с RsaProtectedConfigurationProvider для шифрования всех разделов. Эта часть работает нормально, и приложение может считывать зашифрованную информацию. Мой вопрос при таком подходе касается производительности. Я столкнулся с проблемой при нагрузочном тестировании нашего приложения, когда использование зашифрованной конфигурации происходит почти в 2 раза медленнее при загрузке, чем с незашифрованной конфигурацией. Итак, при запуске моего приложения конфигурация становится незашифрованной и кэшируется в памяти или нет? Или он действительно отправляется на диск каждый раз? Я провел много поисков и не нашел точного ответа на то, что именно здесь происходит. Спасибо за вашу помощь!

Я хотел бы добавить, что это приложение часто использует свойство ConnectionString для доступа к базе данных.

Ответ №1:

Я провел быстрый тест, и похоже, что он загружен в память. Ниже приведен код, который я запустил. После первой строки записи () Я открыл конфигурацию, вручную изменил ее и сохранил файл конфигурации. Вторая строка записи () распечатала старое значение, а не новое, поэтому я бы сделал вывод, что она не открывает файл обратно после того, как прочитает его один раз.

 static void Main(string[] args)
{
    Console.WriteLine(ConfigurationManager.AppSettings("TestSettings"));
    Console.ReadLine();
    //Before hitting return I changed the value of TestSettings manually
    Console.WriteLine(ConfigurationManager.AppSettings("TestSettings"));
    Console.ReadLine();
}
  

Комментарии:

1. Спасибо, я тоже так подумал. Но почему я получаю такое снижение производительности, а затем использую шифрование в конфигурации? Может ли он все еще быть зашифрован в памяти, и каждый раз, когда мне нужно получить доступ к строке подключения, он должен расшифровывать раздел? Это информация, которую мне трудно найти.

2. Да, это может быть. Если вы снова и снова нажимаете на одни и те же настройки, я бы просто перенес их в переменную. Я пытаюсь ограничить количество обращений к файлу конфигурации.

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

Ответ №2:

Хорошо, я нашел ответ на свой собственный вопрос. Как оказалось, снижение производительности, которое я испытывал с зашифрованной конфигурацией, было связано с ошибкой в коде фреймворка нашего решения. По сути, остался избыточный код от того, что мы пытались реализовать, который открывал конфигурацию с диска каждый раз, когда мы обращались к строке подключения или любому параметру приложения:

 var config = ConfigurationManager.OpenMappedExeConfiguration()
  

Я изменил этот код на just use ConfigurationManager.AppSettings[] , и теперь все работает отлично. Итак, я выяснил, что ConfigurationManager считывается с диска при первом обращении к свойству, а также расшифровывает файл только при первом обращении. После этого он просто считывает значения из расшифрованных разделов в памяти.

Комментарии:

1. Итак, на самом деле, мой ответ был правильным? «Итак, при запуске моего приложения конфигурация становится незашифрованной и кэшируется в памяти или нет? Или он действительно отправляется на диск каждый раз?»… просто говорю

Ответ №3:

Вы можете попробовать следующее:

http://www.dotnetprofessional.com/blog/post/2008/03/03/Encrypt-sections-of-WebConfig-or-AppConfig.aspx

трудно превзойти эту производительность

Комментарии:

1. Спасибо за это, но, как я упоминал, я уже могу отлично зашифровать разделы моего файла app.config. Однако я нигде в этом сообщении не заметил, чтобы в нем упоминалось что-либо о производительности запущенного приложения с зашифрованной конфигурацией.