вторник, 25 марта 2014 г.

Шифруем строки соединения с БД в web.confg

Одно из правил "хорошего тона" при созданий приложений с претензией на безопасность и защищенность от взлома - нигде не писать логины и пароли. Особенно пароли к локальным БД в которых, как правило, живут очень-важные-секретные-данные (а вот скажите честно, вы всегда руководствуетесь принципом минимально возможных прав доступа, или честно под sa соединяетесь? ;)


Так вот, в ASP.NET начиная с версии 2.0 существует очень простая возможность прозрачного шифрования строк соединения.  Прежде всего вам необходимо предоставить пользователю, под которым работает IIS, доступ к хранилищу ключей RSA:

aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT Authority\Network Service"

А после этого, для того, чтобы зашифровать содержимое секции достаточно сделать очень простую вещь:
    public void EncryptConnString()
    {  
       Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
       ConfigurationSection section = config.GetSection("connectionStrings");
       if (!section.SectionInformation.IsProtected)
       {
           section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
           config.Save();
       }
    }

И что самое главное, зашифровав секцию таким образом вы все равно сможете ей пользоваться совершенно прозрачно, как будто она и не зашифрована. Единственный минус, работа с зашифрованным секциями несколько медленнее.
   string connString =  WebConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
А вот так можно расшифровать обратно:
    public void DecryptConnString()
    {
        Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
        ConfigurationSection section = config.GetSection("connectionStrings");
        if (section.SectionInformation.IsProtected)
        {
            section.SectionInformation.UnprotectSection();
            config.Save();
        }
    }

То же самое можно сделать и из командной строки, что, зачастую, удобнее:

//шифруем
aspnet_regiis.exe -pef "connectionStrings" "C:\Inetpub\wwwroot\YourWebSite" –prov "RSAProtectedConfigurationProvider"

//расшифровываем
aspnet_regiis.exe -pdf "connectionStrings" "C:\Inetpub\wwwroot\YourWebSite"

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

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

Отправить комментарий