Сценарий:
У меня есть настольное приложение WPF, которое будет распространяться на разных компьютерах для разных клиентов.
Приложение имеет файл конфигурации XML 'ApplicationConfiguration.xml'
Этот XML-файл содержит строки подключения.
Мне нужно зашифровать эти строки подключения, так как файл ApplicationConfiguration.xml будет скопирован в папку установки приложения вместе с основным приложением exe.
Запланированная стратегия:
Моя запланированная стратегия заключалась в том, чтобы зашифровать файл 'ApplicationConfiguration.xml' после установки. (Если бы я мог сделать это во время установки, то все к лучшему)
Что я пробовал:
Придерживаясь стратегии шифрования XML-файла ПОСЛЕ установки, я решил написать простое приложение winforms, которое позволит пользователю найти файл ApplicationConfiguration.xml и просто нажать кнопку для его шифрования.
Когда я сделал это, я получил новый файл, созданный в форме XML-файла конфигурации.
'ApplicationConfiguration.xml.Config' , но исходный файл 'ApplicationConfiguration.xml' все еще оставался нетронутым, а строки подключения остались нетронутыми ...
Теперь .... когда я скопировал содержимое этого файла в мой файл ApplicationConfiguration.xml, программа смогла функционировать как обычно ... XML теперь зашифрован, помните.
Таким образом, похоже, что .NET 4.0 framework может ДЕЙСТВОВАТЬ XML-файл без необходимости писать код в моем приложении WPF.
См. Код ниже для шифрования:
protected void EncryptConfig(Boolean bEncrypt)
{
string path = SelectedFilePath();
Configuration config = ConfigurationManager.OpenExeConfiguration(path);
// Define the Rsa provider name.
const string provider = "RsaProtectedConfigurationProvider";
// 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);
}
}
}
MessageBox.Show("Config has been encrypted");
}
Я опубликовал пример вывода (замена CipherData на фиктивные символы), который создается с помощью кода выше
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings 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>skfjshsadfhsadkjfsadhfsadkhfdsafhsadkfhkljdfh=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>adfdsafdsafdsfdsafsadfsadfsadfsdfasfdsadfsafsadfdsf=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
Итак, у меня есть несколько вопросов о том, что я сделал выше и что я пытаюсь сделать:
1) Может ли приложение считывать зашифрованные строки подключения без записи нового кода в приложении WPF? И если да, сможет ли каждая машина читать зашифрованные строки подключения, если я выполню всю обработку шифрования на своей машине? Поскольку я прочитал о «ключе», необходимом ... и не понимаю, откуда взято ключевое имя выше (ключ Rsa).
2) Почему при сохранении файла xml в приведенном выше примере кода создается новый файл 'xml.config'? Нужно ли вручную копировать недавно сгенерированный код в исходный файл applicationConfiguration.xml?
Просто добавьте, когда я расшифровываю новый файл xml.config, используя следующий код:
connStrings.SectionInformation.UnprotectSection();
config.Save(ConfigurationSaveMode.Full);
.. Я получаю следующий вывод! ЗАЧЕМ! :)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<clear />
<add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
Я бы ожидал получить исходные 3 строки подключения ... нет?
В основном я ищу правильный метод для шифрования XML-файла строк подключения и обеспечения возможности развертывания и чтения приложения на разных компьютерах.
Любая помощь приветствуется.