Зависит ли машинный вызов section.SectionInformation.ProtectSection, то есть я не могу скопировать файл конфигурации и использовать его на другом компьютере?
Да, насколько я могу судить, это правильно. В этой статье говорится, что ключи хранятся для каждого компьютера или для каждого пользователя.
Есть ли поставщик (кроме DataProtectionConfigurationProvider), который является независимым от компьютера?
Не из коробки, два известных мне провайдера (DataProtectionConfigurationProvider
и RSAProtectedConfigurationProvider
) имеют одинаковую "проблему". Я обнаружил несколько подсказок о том, что поставщик RSA допускает повторное использование ключей на разных машинах, но не нашел примеров того, как этого добиться.
Однако есть способ достичь того, что вам нужно, я только вчера сделал это сам, так как у меня была похожая проблема (у меня было требование запустить приложение из сетевого расположения, и все клиенты должны были использовать один и тот же зашифрованный файл конфигурации). Вы можете бросить свой собственный ProtectedConfigurationProvider
. Вот несколько ссылок, которые иллюстрируют концепцию:
Используя эти статьи, я смог создать свой собственный ProtectedConfigurationProvider, который не зависит от компьютера или пользователя, и использовать его в приложении. У меня есть шаг после сборки в моей сборке релиза, который защищает раздел конфигурации, и поэтому я только когда-либо развертываю его защищенную версию. Получение данных в защищенном разделе работает так же, как и на других машинах, без проблем. Конечно, вы должны быть очень осторожны в отношении того, как безопасно шифровать и дешифровать ваши разделы. Есть несколько примеров, описывающих, как это сделать, этот - один из них, я думаю.
Одна из вещей, которая четко не указана ни в одной из трех статей, - как заставить ваше приложение найти вашего провайдера, если вы не используете ASP.net. Обычный способ установки его в глобальный кэш сборок, вероятно, не сработает, поскольку вы заявляете, что запускаете приложение с флешки. Итак, вам нужно добавить его в ваш файл app.config
, как показано ниже:
<?xml version="1.0"?>
<configuration>
...
<configProtectedData defaultProvider="MyEncryptionProvider">
<providers>
<add name="MyEncryptionProvider"
type="MyAssembly.MyEncryptionProvider, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=whatever_the_assembly_token_is" />
</providers>
</configProtectedData>
...
</configuration>
Это должно работать, если сборка, которая выполняет шифрование, находится в том же пути, что и ваша основная сборка. Я использую подписанную сборку, sn -T {Assembly}
выдаст вам PublicKeyToken, который необходимо ввести в файле конфигурации.
Защита раздела выполняется следующим образом:
using System.Configuration;
...
Configuration oConfiguration = ConfigurationManager.OpenExeConfiguration(yourExePath);
oSection.SectionInformation.ProtectSection("MyEncryptionProvider");
oSection.SectionInformation.ForceSave = true;
oConfiguration.Save();
Я протестировал его сегодня, и он работал с файлом конфигурации, зашифрованным на компьютере разработчика (XP SP3), и использовался на XP SP2, Win7 32Bit и Win7 64Bit.
ОТКАЗ
- Не уверен, что все это работает, если вы не подписываете свои сборки.
- Используйте на свой страх и риск, я не специалист по безопасности по любым стандартам.