Qual é o método adequado para criptografar o ASP.NET connetionStrings?

Eu estive examinando vários exemplos de criptografia connectionStrings (Web.config) em um aplicativo ASP.NET MVC (.NET 4.0) e parece que existem duas maneiras gerais de alcançá-lo (Exemplo 1 e os relacionadosexemplo 2):

Use a ferramenta aspnet_regiis.

O principal problema com o uso do aspnet_regiis é que eu posso executar a ferramenta localmente (na minha máquina de desenvolvimento), mas o site realmente hospedado no Arvixe e como qualquer outro host da Web: não há como executar comandos no servidor. Pelo que entendi, se eu criptografar o Web.config connectionStrings na minha máquina e publicar o Web.config, eles não poderão ser descriptografados no servidor (corrija-me se isso estiver errado).

Nota: usei apenas oRSAProtectedConfigurationProvider, mas presumo que oDataProtectionConfigurationProvider terá o mesmo problema, pois é específico ao usuário / máquina.

Criptografar programaticamente a cadeia de conexão.

Criptografar programaticamente o connectionStrings também tem uma desvantagem: toda vez que eu publico meu site, o Web.config é atualizado (com o connectionStrings não criptografado) e isso significa que, por algum período, o Web.config não será criptografado. Mesmo se eu garantir que o Web.config seja publicado apenas quando houver alterações, o problema poderá ser minimizado, mas não mitigado.

Eu pensei que o uso de uma classe estática pode ajudar a reduzir ainda mais o tempo que o connectionStrings não é criptografado. Infelizmente, criptografar o connectionStrings requer o caminho do aplicativo e parece que a única maneira de obter o caminho do aplicativo é a partir da solicitação (Request.ApplicationPath) e em uma classe estática (obviamente) não há solicitação.

private void ProtectSection(string sectionName,
                                   string provider)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
                 config.GetSection(sectionName);

    if (section != null &&
              !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(provider);
        config.Save();
    }
}

private void UnProtectSection(string sectionName)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
              config.GetSection(sectionName);

    if (section != null &&
          section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        config.Save();
    }
}

UnProtectSection("appSettings");

ProtectSection("appSettings",
    "DataProtectionConfigurationProvider");

Qual é a maneira correta de criptografar a connectionString e eliminar / reduzir a quantidade de tempo que a seção Web.config não é criptografada? Você escreve algum tipo de invólucro ao redor doOpenWebConfiguration método que verifica se a seção está criptografada e usa apenas esse invólucro? Os usuários podem acessarqualquer página em seu site, então como adiar a criptografia até que eles solicitem alguns dados de um banco de dados ou verificar se eles foram criptografados na primeira oportunidade?

questionAnswers(3)

yourAnswerToTheQuestion