Cuál es el método adecuado para encriptar las cadenas de conexión ASP.NET?

He estado buscando varios ejemplos de cifrado de connectionStrings (Web.config) en una aplicación ASP.NET MVC (.NET 4.0) y parece que hay dos formas generales de lograrlo Ejemplo y el @ relacionaejemplo 2):

Utilice la herramienta aspnet_regiis.

El problema principal con el uso de aspnet_regiis es que puedo ejecutar la herramienta localmente (en mi máquina de desarrollo), pero el sitio web en realidad está alojado en Arvixe y como cualquier otro servidor web: no hay forma de ejecutar comandos en el servidor. Según tengo entendido, si cifro las cadenas de conexión Web.config en mi máquina y publico la configuración Web.config, entonces no se pueden descifrar en el servidor (corríjame si esto está mal).

Nota: solo usé laRSAProtectedConfigurationProvider, pero supongo que laDataProtectionConfigurationProvider tendrá el mismo problema ya que es específico del usuario / máquina.

Encripte de manera programada la cadena de conexión.

El cifrado programático de connectionStrings también tiene un inconveniente: cada vez que publico mi sitio web, el Web.config se actualiza (con el connectionStrings no cifrado) y esto significa que durante algún tiempo el Web.config no se cifrará. Incluso si me aseguro de que Web.config solo se publique cuando haya cambios, el problema puede minimizarse pero no mitigarse.

Pensé que usar una clase estática podría ayudar aún más a reducir el tiempo de conexión Las cadenas no están encriptadas. Desafortunadamente, el cifrado de connectionStrings requiere la ruta de la aplicación y parece que la única forma de obtener la ruta de la aplicación es desde la solicitud Request.ApplicationPath) y en una clase estática no hay (obviamente) ninguna solicitud.

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");

¿Cuál es la forma correcta de cifrar connectionString y eliminar / reducir la cantidad de tiempo que la sección Web.config no está cifrada? ¿Escribes algún tipo de envoltorio alrededor de laOpenWebConfiguration método que verifica si la sección está encriptada y solo usa ese contenedor? Los usuarios pueden acceder aningun en su sitio web, entonces, ¿cómo demora el cifrado hasta que soliciten algunos datos de una base de datos o verifica si está cifrado en la primera oportunidad?

Respuestas a la pregunta(3)

Su respuesta a la pregunta