Datos personales

jueves, 4 de agosto de 2011

Encriptación de Cadena de conexión en Web.config

Hace unos días tuve un problema de seguridad en una aplicación web desarrollada en Visual Studio 2005 (aspnet 2.0)  ya que la cadena de conexión estaba expuesta en una clase, y necesitaba encontrar una forma de encriptarla.
Tengo la conexión en una función de la siguiente manera:
Dim cn As SqlConnection
cn = New SqlConnection("Data Source=SERVER; Initial Catalog=mibd; User Id=miusuario; Password=miclave;")
cn.Open()

Pues bien,  luego de buscar un poco, decidí colocar la cadena de conexión en el web.config
Entonces en el archivo web.config hacemos lo siguiente:
<connectionStrings>
  <add name="miconexion" connectionString=" Initial Catalog= mibd;
data source=
SERVER;user id= miusuario;password= miclave " />
 </connectionStrings>
Nota:
name="miconexion" ->Nos servirá para referenciar a nuestra conexión más adelante.
Guardamos el archivo web.config.
Ahora agregamos una referencia al proyecto: Clic derecho en el Website àAdd reference. En la pestaña .NET, referenciamos a System.Configuration.
Listo, ahora en la clase desde obtendremos nuestra conexión hacemos lo siguiente:
Imports System.Configuration
Public Class clsconexion
    Public Function conexion() As SqlConnection
        Dim cn As SqlConnection
        Try           
            Dim con As String = System.Configuration.ConfigurationManager.ConnectionStrings("miconexion").ConnectionString
            cn = New SqlConnection(con)
            cn.Open()
        Catch ex As Exception
            Throw
        End Try
        Return cn
    End Function
End Class


Ok, Hasta aqui la conexión ya está guardada en el Web.config
Ahora para encriptar la sección del web.config que contiene la conexión, entraremos a la línea de comandos y escribimos lo siguiente:
C:\Windows\Microsoft.Net\Framework\v2.0.50727>aspnet_regiis -pe "connectionStrings" -app "/MyWebSite"
Donde “MyWebSite”, es el nombre de tu Website.
Ahora si entramos al archivo web.config de nuestro proyecto, encontraremos una sección encriptada. Algo así:
<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>GIB5/2UkUOTWG4sxtys9UQMfdfsdfsdf80fdEbB4v915F42RzQVigqJBdCvQbvHDmfJgGWZ6IQU8FLQ/dND2gKtL85qqQRjue/es7D8SJBJkuniZ6ChF74+u763+elTcBcgX9OCRYaqeQpe9BFjPoDJD8oZ5QigXbtS4XS/0JYP7TgOJ2B0=</CipherValue>
     </CipherData>
    </EncryptedKey>
   </KeyInfo>
   <CipherData>
    <CipherValue>dSrDeb7medfsfsdfYmO5j/e1Oo5lDCoX5Q5Z+gq01KwAmWItOGvofUAlZitJm2Sghs/7jwHR24699IsoSYjnjNgHIr8dfsdfsWmsyD/I7vjQwHB+7o1Eb7cIn84j6asWTEeyOEkFHjvUopGfAA+kRYkizb7c92EYRMRXJ8BBOMliHjXacT9tvyjTErvvWMuL/7fFa3shjefFvnjQV8EfUI2MAA97vE0HIb7ysoZ2sUdOT/yJSrlwdfCWJ1XWaLKHuLlAeOyEc/G8WmluVG5pPEKLTpjp2bJ+Qv6iKYwvxQyctJ3o2iJafm5qlpT4OXzqWRg==</CipherValue>
   </CipherData>
  </EncryptedData>
 </connectionStrings>
El cifrado depende de la máquina donde está instalado IIS por tanto, si tenemos dos entornos NO podemos copiar el archivo web.config con secciones cifradas de un servidor a otro pues en el nuevo no se interpretaría el cifrado. Debe ejecutarse el comando individualmente en ambos servidores
Si queremos regresar la cadena de conexión a su estado normal (desencriptar) haremos lo siguiente:
C:\Windows\Microsoft.Net\Framework\v2.0.50727>aspnet_regiis -pd "connectionStrings" -app "/MyWebSite"

Espero haber ayudado a los que tuvieron el mismo problema que yo. Saludos
Con respecto a la función que anteriormente hemos creado, no tenemos que hacer nada adicional, ya que el IIS es el que se encarga de realizar la desencriptación de la conexión.

No hay comentarios:

Publicar un comentario