Siempre necesitamos proveer a nuestras soluciones un alto nivel de seguridad para evitar los posibles ataques tanto del exterior como dentro de nuestra propia empresa. Para lograr esto vamos a utilizar el proveedor de configuración protegida RSA y la herramienta aspnet_regiis.exe para poder lograr la encriptación de secciones del Web.Config.
Es posible importar y exportar las claves RSA de un servidor a otro, esto nos ayudará a utilizar el mismo cifrado en varios servidores.
Para encriptar la sección connectionString del Web.Config vamos a realizar los siguientes pasos:
1. Vamos a crear un sitio llamado EncriptacionRSA
2. Vamos a agregar el siguiente código en la sección connectionString dentro del archivo Web.Config
<connectionStrings>
<add name="MyLocalSQLServer"
connectionString="Initial Catalog=aspnetdb;
data source=localhost;Integrated Security=SSPI;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
3. Ahora vamos a la línea de comandos para ejecutar la siguiente instrucción:
%WinDir%\Microsoft.NET\Framework\<númeroVersión>\aspnet_regiis -pe "connectionStrings" -app "/EncriptacionRSA"
El comando anterior, con el modificador -app, asume que hay un directorio virtual IIS llamado MachineRSA. Si está utilizando el servidor Web de Visual Studio .NET 2005 en lugar de IIS, utilizaremos el modificador -pef, que nos permitirá especificar la ubicación física del directorio del Web.Config
%WinDir%\Microsoft.NET\Framework\<númeroVersión>\aspnet_regiis.exe -pef "connectionStrings" C:\Projects\EncriptacionRSA
Si el comando es ejecutado de forma correcta deberemos de obtener el siguiente resultado:
Encrypting configuration section...
Succeeded!
Las claves RSA se almacenan en la siguiente ruta:
\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
Una vez que ejecutamos esto, en el archivo Web.Config tendremos el siguiente resultado:
<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>R7cyuRk+SXJoimz7wlOpJr/YLeADGnwJVcmElHbrG/B5dDTE4C9
rzSmmTsbJ9Xcl2oDQt1qYma9L7pzQsQQYqLrkajqJ4i6ZQH1cmiot8ja7Vh+yItes7TRU
1AoXN9T0mbX5H1Axm0O3X/285/MdXXTUlPkDMAZXmzNVeEJHSCE=
</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>d2++QtjcVwIkJLsye+dNJbCveORxeWiVSJIbcQQqAFofhay1wMci8FFlb
QWttiRYFcvxrmVfNSxoZV8GjfPtppiodhOzQZ+0/QIFiU9Cifqh/T/7JyFkFSn13bTKjbYmHObKA
zZ+Eg6gCXBxsVErzH9GRphlsz5ru1BytFYxo/lUGRvZfpLHLYWRuFyLXnxNoAGfL1mpQM7M46x5Y
WRMsNsNEKTo/PU9/Jvnh/lT+GlcgCs2JRpyzSfKE7zSJH+TpIRtd86PwQ5HG3Pd2frYdYw0rmlml
I9D
</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
Ahora vamos a comprobar si el encriptación y desencriptación funciona correctamente, para esto vamos a nuestra página Default.aspx y vamos a agregar el siguiente código de la sección HTML
<%@ Page Language="C#" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e) {
Response.Write("Clear text connection string is: " + ConfigurationManager.ConnectionStrings
["MyLocalSQLServer"].ConnectionString);
}
</script>
<html>
<body/>
</html>
MyLocalSQLServer es la cadena de conexión que especificamos en el Web.Config
Por último para regresar la sección del configurationString a su estado original vamos a ocupar el siguiente comando:
%WinDir%\Microsoft.NET\Framework\<númeroVersión>\aspnet_regiis -pd "connectionStrings" -app "/EncriptacionRSA"
y para si ocupamos una ruta física ocupamos el siguiente comando:
%WinDir%\Microsoft.NET\Framework\<númeroVersión>\aspnet_regiis -pdf "connectionStrings" C:\Projects\EncriptacionRSA
Si el comando funciona correctamente obtendremos el siguiente resultado:
Decrypting configuration section...
Succeeded!
Espero que esto les ayude en sus aplicaciones y no olviden de colocar sus comentarios, si les parece bien todo esto, y recuerden postear en los foros, esta comunidad es para ustedes y sólo con la participación de todos haremos que sea la más grande de toda América Latina.
Saludos!
Víctor Alameda