Let's Code!

1. Análisis del problema:

Cuando se manejan datos sensibles a través de nuestra aplicación, generalmente se opta por encriptar los datos en nuestra base de datos. Para ello nuestra aplicación debe tomar los datos de ingreso, encriptar los datos y registrarlos en una tabla. Lógicamente se debe hacer el proceso inverso para mostrar los datos sensibles al usuario de nuestra aplicación: leer los datos de la tabla, desencriptar los datos y mostrarlos al usuario.

Dentro del desarrollo de aplicaciones orientada a Dominio o Domain Driven Development (DDD), nosotros manejamos entidades de dominio, que son nuestros objetos que están mapeados siempre a uno o más registros en nuestra base de datos. A la herramienta que nos ayuda a realizar ese mapeo de objetos/registros, los conocemos como herramientas ORM (Object Relational Model).

Existen diversos frameworks que nos ayudan a implementar este mapeo de objetos/registros. Entre ellos Hibernate y EntityFramework son los más usados. Éste último está creciendo muy rápidamente y acercándose al gigante Hibernate.

Esta serie de posts tiene como objetivo brindar una solución a la encriptación de datos con Entity Framework sobre una base de datos SQL Server.

Manos a la obra..

2. Modelo de dominio:

Nuestro modelo de datos está compuesto por sólo una entidad, la cual contendrá datos encriptados y otros no encriptados. Es necesario saber que los campos encriptados deben almacenarse en un campo del tipo nvarchar(MAX), puesto que el valor encriptado puede contener más caracteres  que el valor original.

Modelo de datos a encriptar.

Modelo de datos a encriptar.

 

 

3. Clase de encriptación:

Lo siguiente es definir el algoritmo de encriptación que vamos a utilizar para cifrar nuestros datos.
En nuestro caso, vamos a usar el algoritmo estandar AES (AES).
Para tal caso, vamos a crear nuestra clase de ayuda que contenga los métodos de Encriptar y Desencriptar.

namespace JhonPierre.Cripto
{
   /// <summary>
   /// Administrador de la encriptación AES 128 bits.
   /// </summary>
   public class AESCryptoManager
   {
     // 128bit(16byte)IV and Key
     private string _aesIV = @"!QBD2WSL#EFC5RFV";
     private string _aesKey = @"6TGB&ZGN7ULK(IK<";

     public String AesIV
     {
      get { return _aesIV; }
      set { _aesIV = value; }
     }

     public String AesKey
     {
       get { return _aesKey; }
       set { _aesKey = value; }
     }

     /// <summary>
     /// Encripta el texto especificado como parámetro.
     /// </summary>
     /// <param name="text"></param>
     /// <returns></returns>
     public string Encriptar(object text)
     {
      if (text == null) return null;

      try
      {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
          aes.BlockSize = 128;
          aes.KeySize = 128;
          aes.IV = Encoding.UTF8.GetBytes(AesIV);
          aes.Key = Encoding.UTF8.GetBytes(AesKey);
          aes.Mode = CipherMode.CBC;
          aes.Padding = PaddingMode.PKCS7;

          // Convert string to byte array
          byte[] src = Encoding.Unicode.GetBytes(text.ToString());

          // encryption
          using (ICryptoTransform encrypt = aes.CreateEncryptor())
          {
            byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);

            // Convert byte array to Base64 strings
            return Convert.ToBase64String(dest);
          }
        }
      }
      catch
      {
        return null;
      }
    }

    /// <summary>
    /// Desencripta el texto cifrado enviado como parámetro.
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    public string Desencriptar(string text)
    {
      if (text == null) return null;

      try
      {
        using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
        {
          aes.BlockSize = 128;
          aes.KeySize = 128;
          aes.IV = Encoding.UTF8.GetBytes(AesIV);
          aes.Key = Encoding.UTF8.GetBytes(AesKey);
          aes.Mode = CipherMode.CBC;
          aes.Padding = PaddingMode.PKCS7;

          // Convert Base64 strings to byte array
          byte[] src = System.Convert.FromBase64String(text);

          // decryption
          using (ICryptoTransform decrypt = aes.CreateDecryptor())
          {
            byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
            return Encoding.Unicode.GetString(dest);
          }
        }
      }
      catch
      {
       return null;
      }
    }

   }
}

 

Deja un comentario