Una pregunta muy típica con la que me suelo encontrar es la de: "¿Cómo puedo hacer para proteger la información de mi cadena de conexión a la base de datos si ésta la pongo en mi web.config?".
Bueno, lo primero que he de decir es que siempre conviene usar mejor la seguridad integrada de Windows (cadena de conexión con "Integrated Security=SSPI;") que las cuentas propias de SQL Sever, por lo que en ese caso no sería necesario encriptar nada. Por otro lado existe un manejador de peticiones de IIS que impide que el contenido de los archivos web.config sea accedido mediante HTTP, por lo que sólo debería preocuparnos que alguien viera nuestra configuración en caso de tener un agujero de seguridad en el servidor o bien en nuestro código (por cierto, aprende a evitarlos), en cuyo caso tendríamos un problema mucho mayor que el hecho de que sepan las credenciales de un usuario de SQL Server, que ya de por si debería estar bastante limitado en cuanto a permisos.
No obstante es interesante saber que en ASP.NET 2.0 o 3.5 podemos encriptar cualquier sección de nuestro web.config de forma sencilla y transparente para nuestro código.
Podemos hacerlo por código, pero lo más sencillo y lo que usaremos casi todas las veces es la herramienta de línea de comandos aspnet_regiis.exe, ubicado en la carpeta "C:\Windows\Microsoft.NET\Framework\v2.0.50727". Sólo hay que pasarle el tipo de proveedor de cifrado que queremos usar (-prov), el modificador "-pef" para indicar que queremos cifrar una ruta física, la sección a encriptar, y la ruta en el disco duro donde está el web.config a cifrar.
Por ejemplo:
aspnet_regiis.exe -pef "connectionStrings" "C:\miRaizIIS\MisitioWeb" –prov "DataProtectionConfigurationProvider"
Que indica que queremos cifrar la sección "connectionStrings" del web.config ubicado en "C:\MiRaiz\MiStioWeb", usando para ello el proveedor de la DPAPI (más sobre esto ahora).
De este modo obtendremos una cadena del estilo de esta:
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAt ...... +hXziceYxOxY=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
(he quitado la mayor parte de la cadena cifrada porque es muy larga).
Lo más estupendo de esto es que no tendremos que tocar ni una sola línea de nuestro código para que funcione, ya que ASP.NET descifra de manera transparente la cadena de conexión al leerla desde la configuración.
Con el parámetro -prov (opcional) podremos especificar el proveedor de cifrado que queremos utilizar. Por defecto se nos proporcionan dos: el mecionado "DataProtectionConfigurationProvider" que cifra usando la DPAPI (Data Protection API de Windows), o bien el "RsaProtectedConfigurationProvider", que usa una pareja de claves pública/privada para cifrar y descifrar, y es el que se usará por defecto si no especificamos ninguno. Si quisiésemos usar un cifrado propio podemos construir una clase proveedora y especificarla con -prov al usar esta herramienta.
Desde mi punto de vista es mejor usar siempre DPAPI, ya que es una criptogra´fia muy segura y está atada por completo al equipo en elq ue se ha realizado el cifrado. De este modo aunque alguien lograse leer el archivo web.config y llevárselo a otro equipo no podría descifrarlo. Por este mismo motivo, una nota de precaución: debes usar esta técnica directamente en el servidor en el que va a estar la aplicación funcionando, puesto que si por ejemplo cifras en tu equipo de desarrollo y luego lo mueves a un servidor de producción, no se podrá descifrar la sección una vez allí. Así que haz el cifrado en el equipo donde va a funcionar la aplicación.
Se puede cifrar cualquier sección del web.config, y no sólo la de las cadenas de conexión. Las únicas que nose pueden cifrar son estas:
* <processModel>
* <runtime>
* <mscorlib>
* <startup>
* <system.runtime.remoting>
* <configProtectedData>
* <satelliteassemblies>
* <cryptographySettings>
* <cryptoNameMapping>
* <cryptoClasses>
Las demás no hay problema ninguno si las ciframos, y se usarán del mismo modo, siendo el descifrado transparente para el programador.
¿Y si me olvido de lo que ponía y necesito volver a tenerlas en claro?
No hay problema. Podemos usar el mismo ejecutable con la opción -pdf para descifrar:
aspnet_regiis.exe -pdf "connectionStrings" "C:\miRaizIIS\MisitioWeb"
Con esto conseguiremos que la sección vuelva a mostrar su contenido en claro.
Espero que te sea útil :-)