sábado, 30 de noviembre de 2019

Encriptar las conexiones de acceso a base de datos del archivo App.config (Visual Basic. Net)

Muchas veces desarrollamos aplicaciones en las que hay que acceder a una base de datos a través de una cadena de conexión en la que aparece el usuario y la password, además dicha cadena es perfectamente consultable por cualquier desarrollador.

Esta incrustación de cadenas de conexión en el código de la aplicación puede producir vulnerabilidades en la seguridad y problemas de mantenimiento. Además, si la cadena de conexión cambia en algún momento, será necesario compilar de nuevo la aplicación. Por estas razones, se recomienda almacenar las cadenas de conexión en un archivo de configuración de la aplicación.


Encriptar las conexiones de acceso a base de datos del archivo App.config (Visual Basic. Net)
Más imágenes como esta aquí


Uso de clases de configuración

El espacio de nombres System.Configuration proporciona clases para trabajar con valores de configuración mediante programación. La clase ConfigurationManager proporciona acceso a los archivos de configuración de equipo, aplicación y usuario.
El espacio de nombres System.Security.Cryptography contiene clases que proporcionan opciones adicionales para cifrar y descifrar datos. Se pueden utilizar estas clases si necesitamos encriptar la configuración de nuestra aplicación. Algunas de estas clases son contenedores de Microsoft CryptoAPI no administrado, mientras que otras son simplemente implementaciones administradas.

Ejemplo de App.config

En este ejemplo se muestra cómo alternar el cifrado de la sección connectionStrings del archivo app.config en una aplicación de Windows. En este ejemplo, el procedimiento recibe el nombre de la aplicación como argumento, por ejemplo, "MiAplicación.exe". Esto cifra el archivo app.config se cifra y se copia a la carpeta que contiene el ejecutable con el nombre "Miaplicacion.exe.config".

Nota

La cadena de conexión solo se puede descifrar en el equipo donde se ha cifrado.
El código utiliza el método OpenExeConfiguration  para abrir el archivo app.config para edición y el método GetSection  devuelve la sección connectionStrings. A continuación, el código comprueba la propiedad IsProtected y llama a ProtectSection para cifrar la sección si no está cifrada. Para descifrar la sección se llama al método UnprotectSection. El método Save completa la operación y guarda los cambios.

Nota

Para ejecutar el código, se debe establecer una referencia al archivo System.Configuration.dll del proyecto.
Este programa encripta y desencripta alternativamente, pero en este ejemplo hemos comentado la parte que desencripta, pues nos interesa encriptarlo (pero se deja comentada por si necesitáramos desencriptar en algún momento).

' Recibe como parámetro el archivo ejecutable sin la extensión .config
    Private Sub EncriptarConfig(ByVal exeConfigName As String)

        Try
            ' Abre el archivo de conexión y recupera la sección connectionStrings.
            Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(exeConfigName)
            Dim section As ConnectionStringsSection = TryCast(config.GetSection("connectionStrings"), ConnectionStringsSection)

            ' Quita la encriptación.
            'If section.SectionInformation.IsProtected Then
            '    section.SectionInformation.UnprotectSection()
            'Else
            ' encripta la sección.
            section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
            'End If
            ' Save the current configuration.
            config.Save()
            Console.WriteLine("Protected={0}", section.SectionInformation.IsProtected)
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub
Se hace funcionar este procedimiento llamándolo desde la sección main de nuestra aplicación  de este modo.

Sub Main()
      EncriptarConfig("Miaplicacion.exe")
End Sub

Se ejecuta el programa una vez de tal modo que cuando termine podemos consultar el archivo encriptado en:

C:/Proyectos\Miaplicacion\MiAplicacion\bin\x86\Debug  

Esto deja un archivo llamado  connections.config  lo abrimos y sustituimos su contenido por las conexiones sin encriptar. En este caso la sección connectionStrings la tenemos separada en un archivo connections.config separado de App.config y se llama desde este último con la línea.

<connectionStrings configSource="connections.config"/>
Al abrir el archivo podemos copiar su contenido y sustituirlo donde teníamos las conexiones sin encriptar.

<!--<connectionStrings>
  Aqui estaban las conexiones sin encriptar
 
</connectionStrings>-->

<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
  <EncryptedData>
    <CipherData>
      <CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAKQYvKMIPPki6I47L7LrvbgQAyACAAAAAAADZgAA8AAAABAgf7P8aclsK8ZqEfkc=</CipherValue>
    </CipherData>
  </EncryptedData>
</connectionStrings>

Ahora al ejecutar la aplicación, si funciona todo correctamente. Se puede comentar la llamada a la función de encriptación, pues no es necesario estar encriptando las conexiones constantemente. También se deben eliminar las conexiones sin encriptar.

Hay que tener en cuenta que la encriptación no se debe hacer en el equipo de desarrollo sino en el de producción donde se vaya a ejecutar el programa para que al ejecutarlo en producción puede resolver los código cifrados y funcione sin problemas.

Referencia:

No hay comentarios:

Publicar un comentario