Luego de varios días de trabajo pesado, nuevamente tengo tiempo para publicar en mi blog.

Para este post trataré de dar respuesta a una pregunta que se genera constantemente en los foros de MSDN, como encryptar los valores enviados a través del queryString en una URL.

Primero que nada he de decir que métodos de encriptación hay muchos, desde los personales hasta el MD5 y todos los conocidos. En nuestro ejemplo, trabajaremos con un código de encriptación utilizando el DESCryptoServiceProvider de asp.net más el método Left que se encuentra en la clase que publique en un post anterior

Funciones Con String

Para iniciar, debo comentar que para nuestra clase de encriptación crearemos dos métodos uno para encriptar y otro para desencriptar. Algunos se preguntaran para que el método de desencriptar. Pues sencillo, si estamos enviando valores por medio del QueryString en una URL, es porque esos valores los utilizaremos para realizar algún tipo de operación, entonces, que hacemos con unos valores encriptados? pues complicaríamos el trabajo un poco mas, así que, nuestros objetivos serán:

1. Encriptar los datos

2. Enviarlos encriptados por queryString

3.Recibirlos y desencriptarlos

4. Procesarlos.

Para empezar crearemos una nueva clase llamada Encryption, que contendrá nuestro métodos

Seguidamente, declararemos dos variables de Tipo byte que contendrán los datos que encriptemos y una de tipo string que contendrá los caracteres de encriptación

   1: static byte[] key = { };
   2:     static byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
   3:     static string sEncryptionKey = "!#$a54?3";

 

Ahora, agregamos un nuevo método llamado Decrypt que será el encargado de desencriptar los datos enviados

   1: public string Decrypt(string stringToDecrypt)
   2:    {
   3:        byte[] inputByteArray = new byte[stringToDecrypt.Length + 1];
   4:        try
   5:        {
   6:            key = System.Text.Encoding.UTF8.GetBytes(LeftRightMid.Left(sEncryptionKey, 8));
   7:            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   8:            inputByteArray = Convert.FromBase64String(stringToDecrypt);
   9:            MemoryStream ms = new MemoryStream();
  10:            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write);
  11:            cs.Write(inputByteArray, 0, inputByteArray.Length);
  12:            cs.FlushFinalBlock();
  13:            System.Text.Encoding encoding = System.Text.Encoding.UTF8;
  14:            return encoding.GetString(ms.ToArray());
  15:        }
  16:        catch (Exception e)
  17:        {
  18:            return e.Message;
  19:        }
  20:    }

 

Y por ultimo creamos el método mas importante, el de encriptación

   1: public string Encrypt(string stringToEncrypt)
   2:    {
   3:        try
   4:        {
   5:            key = System.Text.Encoding.UTF8.GetBytes(LeftRightMid.Left(sEncryptionKey, 8));
   6:            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   7:            byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToEncrypt);
   8:            MemoryStream ms = new MemoryStream();
   9:            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
  10:            cs.Write(inputByteArray, 0, inputByteArray.Length);
  11:            cs.FlushFinalBlock();
  12:            return Convert.ToBase64String(ms.ToArray());
  13:        }
  14:        catch (Exception e)
  15:        {
  16:            return e.Message;
  17:        }
  18:    }

Como vemos, el proceso de encriptación puede ser algo sencillo que realmente puede ayudar mucho a la seguridad de un sitio, especialmente cuando los datos que enviamos son de extremo cuidado.

Como siempre, para terminar el código de ejemplo