Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta Seguridad. Mostrar todas las entradas

miércoles, 4 de julio de 2012

Brindando seguridad a nuestras aplicaciones

Son muchas las ocasiones en que necesitamos implementar mecanismos de seguridad confiables en nuestras aplicaciones, sin que sean excesivamente complicadas o difíciles de desarrollar. En esta ocasión voy a implementar una solución basada en hash, usando para ello las utilidades de encripción aportada por el Framework de .NET

Este tipo de mecanismos ofrecen un buen nivel de seguridad a nuestras aplicaciones, ya que las hash son de tamaño fijo, y pueden representar una gran cantidad de datos. Sumado a ello cualquier cambio que se realice en los datos ocasionan grandes cambios imprevisibles en el valor hash

En esta guía utilizaremos el algoritmo SHA1, el cual es de 160 bits. Este mecanismo esta pensado como una solución para manejar las contraseñas de usuarios, pues se buscaba un mecanismo que garantizara que no hubiese forma de descifrar las contraseñas.

Así en lugar de almacenar una contraseña cifrada, se almacena la hash de dicha contraseña. Esto significa que la contraseña es irrecuperable, lo que garantiza un buen nivel de seguridad pues aun cuando la información sea sustraída no hay posibilidad alguna de recuperar las contraseñas.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

El siguiente es el método que obtiene la hash:

   1: public string GetSHA1(string data)
   2: {
   3:     SHA1CryptoServiceProvider Sha1 = new SHA1CryptoServiceProvider();
   4:     Byte[] buffer;
   5:  
   6:     //Convertimos la cadena en un arreglo0 de bytes
   7:     buffer = Encoding.ASCII.GetBytes(data);
   8:  
   9:     //Obtenemos la hash, y la codificamos en base 64 para evitar caracteres no soportados
  10:     return Convert.ToBase64String(Sha1.ComputeHash(buffer));
  11: }

Como se puede ver es bastante sencillo de implementar, si se desea elevar el nivel de seguridad se puede cifrar la contraseña antes de calcular la hash. En mi caso esta ultima ha sido la solución implementada.


Etiquetas de Technorati: ,,,

Cifrado con Triple DES


Triple DES es el algoritmo que hace triple cifrado del DES, también es conocido como TDES o 3DES, fue desarrollado por IBM en 1978.

Cuando se descubrió que una clave de 56 bits no era suficiente para evitar un ataque de fuerza bruta, TDES fue elegido como forma de agrandar el largo de la clave sin necesidad de cambiar de algoritmo de cifrado. Este método de cifrado es inmune al ataque por encuentro a medio camino, doblando la longitud efectiva de la clave (112 bits), pero en cambio es preciso triplicar el número de operaciones de cifrado, haciendo este método de cifrado muchísimo más seguro que el DES. Por tanto, la longitud de la clave usada será de 192 bits, aunque como se ha dicho su eficacia solo sea de 112 bits.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

Empecemos por el método de cifrado.

   1: public string Encryption(string data, string key)
   2: {
   3:     TripleDESCryptoServiceProvider TDes = new TripleDESCryptoServiceProvider();
   4:     MD5CryptoServiceProvider Hash = new MD5CryptoServiceProvider();
   5:  
   6:     Byte[] buffer;
   7:  
   8:     try
   9:     {
  10:         //Se convierte la cadena en un arreglo de bytes
  11:         buffer = Encoding.ASCII.GetBytes(data);
  12:  
  13:         //Definimos la llave de encripción, en este caso se me ocurrio incrementar la seguridad
  14:         //usando como llave  de encripción, la hash MD5 de la llave que se especificada en el metodo
  15:         TDes.Key = Hash.ComputeHash(Encoding.ASCII.GetBytes(key));
  16:  
  17:         //Se define el modo de cifrado que se desea utilizar
  18:         TDes.Mode= CipherMode.ECB;
  19:  
  20:         //Se crea el encriptor y se transforma el bloque de bits, se convierte a texto en base 64 para poderlo manejar
  21:         //ya que asi es mas viable el uso sobre con HTTP
  22:         return Convert.ToBase64String(TDes.CreateEncryptor().TransformFinalBlock (buffer,0,buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     {
  26:         Console.WriteLine("Se genero un error al cifrar los datos! : {0}", ex.ToString());
  27:         throw ex;
  28:     }
  29: }

En este caso TDES maneja una llave mas larga razón por la cual se me ocurrió que en lugar de la llave que se recibe por parámetro, seria mejor utilizar el hash de la misma, de esta forma se hace aun mas robusto el mecanismo.


Es importante entender que existen diferentes métodos de cifrado, y que se debe usar el mismo tanto para el cifrado como para el descifrado del mensaje.


A continuación veremos el método para descifrar los datos que previamente hemos cifrado.


   1: public string Decryption(string data, string key)
   2: {
   3:     TripleDESCryptoServiceProvider TDes = new TripleDESCryptoServiceProvider();
   4:     MD5CryptoServiceProvider Hash = new MD5CryptoServiceProvider();
   5:  
   6:     Byte[] buffer;
   7:  
   8:     try
   9:     {
  10:         //Se convierte la cadena en un arreglo de bytes
  11:         buffer = Convert.FromBase64String(data);
  12:  
  13:         //Definimos la llave de encripción, en este caso se me ocurrio incrementar la seguridad
  14:         //usando como llave  de encripción, la hash MD5 de la llave que se especificada en el método
  15:         TDes.Key = Hash.ComputeHash(Encoding.ASCII.GetBytes(key));
  16:  
  17:         //Se define el modo de cifrado que se desea utilizar
  18:         TDes.Mode = CipherMode.ECB;
  19:  
  20:         //Se crea el desencriptor y se transforma el bloque de bits, se convierte a texto en base 64 para poderlo manejar
  21:         //ya que asi es mas viable el uso en ambientes de redes
  22:         return Encoding.ASCII.GetString(TDes.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     {
  26:         Console.WriteLine("Se genero un error al descifrar los datos! : {0}", ex.ToString());
  27:         throw ex;
  28:     }
  29: }

Como se puede ver, no es un proceso complicado, al contrario, es muy sencillo de implementar y nos permite gozar de un nivel de seguridad mas que adecuado para la mayoría de nuestras aplicaciones, si bien no es adecuada para ambientes donde la seguridad es el atributo de calidad dominante, si es una muy buena opción como mecanismo de seguridad en un entorno normal.


Etiquetas de Technorati: ,,,

jueves, 28 de junio de 2012

Cifrado con DES

Data Encryption Standard (DES) es un algoritmo de cifrado, fue escogido como un estándar FIPS en los Estados Unidos en 1976, en aquel tiempo alcanzo gran popularidad, pero hoy en día se considera inseguro, esto en parte a que la longitud de clave es de solo 56 bits.
Aun cuando puede no ser apto para un entorno en el que se requiere una gran seguridad si puede ser usado en aplicaciones mas sencillas para brindar un nivel de seguridad mas que aceptable. Bajo esta premisa, veremos la forma de implementar este mecanismo de cifrado en nuestras aplicaciones.

Servicios de Criptografía

En .Net los servicios de criptografía están definidos en el namespace System.Security.Cryptography, el cual provee mecanismos de codificación y decodificación de datos, además de otras operaciones tales como hashing, generación números aleatorios, y mensajes de autenticación.

Manos a la obra

Empecemos por crear el método que cifrar los datos:
 
   1: private static string Coding(string cadena, string key)
   2: {
   3:     DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   4:     Byte[] buffer;
   5:     Byte[] cryptoKey=new byte[8];
   6:     
   7:     try
   8:     {
   9:         //Se convierte la cadena en un arreglo de bytes
  10:         buffer = Encoding.ASCII.GetBytes(cadena);
  11:  
  12:         //Se convierte la llave en un array de bytes y se toman 8 bytes que usa DES
  13:         Array.Copy(ASCIIEncoding.ASCII.GetBytes(key), 0, cryptoKey, 0, 7);
  14:  
  15:         //Se define la llave de encripción
  16:         des.Key = cryptoKey;
  17:  
  18:         //Se define el modo de cifrado que se desea utilizar
  19:         des.Mode = CipherMode.ECB;
  20:  
  21:         //Se crea el encriptor y se transforma el bloque de bits, se convierte a texto en base 64 
  22:         //ya que asi es mas viable el uso sobre redes
  23:         return Convert.ToBase64String(des.CreateEncryptor().TransformFinalBlock(buffer, 0, buffer.Length));
  24:     }
  25:     catch (Exception ex)
  26:     {
  27:         Console.WriteLine("Se ha presentado un error! : {0}", ex.ToString());
  28:         throw;
  29:     }
  30: }


Como se puede observar, la llave que usa DES es de 8 bytes, así que se toman solo 8 bytes de el array, pues de otra forma se generara una excepción.

Es importante entender que existen diferentes métodos de cifrado, y que se debe usar el mismo tanto para el cifrado como para el descifrado del mensaje.
A continuación veremos el método para descifrar los datos que previamente hemos cifrado.

   1: private static string UnCoding(string cadena, string key)
   2: {
   3:     DESCryptoServiceProvider des = new DESCryptoServiceProvider();
   4:     Byte[] buffer;
   5:     Byte[] cryptoKey = new byte[8];
   6:  
   7:     try 
   8:     {
   9:         //Se convierte la cadena en un arreglo de bytes
  10:         buffer = Convert.FromBase64String(cadena);
  11:  
  12:         //Se convierte la llave en un array de bytes y se toman 8 bytes que usa DES
  13:         Array.Copy(ASCIIEncoding.ASCII.GetBytes(key), 0, cryptoKey, 0, 7);
  14:  
  15:         //Se define la llave de encripción
  16:         des.Key = cryptoKey;
  17:  
  18:         //Se define el modo de cifrado que se desea utilizar
  19:         des.Mode = CipherMode.ECB;
  20:  
  21:         //Se crea el decodificador y se transforma el bloque de bits, se convierte a una cadena de texto
  22:         return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(buffer, 0,buffer.Length));
  23:     }
  24:     catch (Exception ex)
  25:     { 
  26:         Console.WriteLine("Se ha presentado un error al decodificar! : {0}", ex);
  27:         throw ;
  28:     }
  29: }

Como se puede ver, no es un proceso complicado, al contrario, es muy sencillo de implementar y nos permite gozar de un moderado nivel de seguridad en aplicaciones donde por diferentes motivos la seguridad no esta entre los atributos de seguridad dominantes, pero que tampoco queremos dejarla de lado totalmente.

Etiquetas de Technorati: ,,,,,,