Строка соединения RsaProtectedConfigurationProvider Стратегия - PullRequest
4 голосов
/ 20 декабря 2011

Сценарий: У меня есть настольное приложение 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-файла строк подключения и обеспечения возможности развертывания и чтения приложения на разных компьютерах.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

• Переименование файла App.config в web.config. • Запуск командной строки от имени администратора:


• Для шифрования:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" your project location within quotes and -prov "DataProtectionConfigurationProvider"

Пример:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef "connectionStrings" "D:\location\location1\location2\location3\location4" -prov "DataProtectionConfigurationProvider" 

• Для расшифровки:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings" your project location within quotes

Пример:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf "connectionStrings" "D:\location\location1\location2\location3\location4" 

• При ошибке: добавить это в конфигурацию enter image description here

(xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0")

• Наконец переименуйте web.config в App.Config

0 голосов
/ 20 декабря 2011

См. .Net Encryption - API защиты данных здесь не поможет, вам нужно будет отправить его в незашифрованном виде, чтобы локально зашифровать на ключе компьютера / пользователя.

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

...