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 " />
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