martes, 3 de abril de 2012

Como obtener el hash SHA256 en C#

Según la wikipedia, la familia SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es un sistema de funciones hash criptográficas relacionadas de la Agencia de Seguridad Nacional de los Estados Unidos y publicadas por el National Institute of Standards and Technology (NIST). El primer miembro de la familia fue publicado en 1993 es oficialmente llamado SHA. Sin embargo, hoy día, no oficialmente se le llama SHA-0 para evitar confusiones con sus sucesores. Dos años más tarde el primer sucesor de SHA fue publicado con el nombre de SHA-1. Existen cuatro variantes más que se han publicado desde entonces cuyas diferencias se basan en un diseño algo modificado y rangos de salida incrementados: SHA-224, SHA-256, SHA-384, y SHA-512 (llamándose SHA-2 a todos ellos).

Al igual que con MD5, .NET nos ofrece la posibilidad de obtener el valor SHA256 de una manera muy sencilla. Tan sólo debemos usar el siguiente código
public string SHA256Encrypt(string input)
{
  SHA256CryptoServiceProvider provider = new SHA256CryptoServiceProvider();

  byte[] inputBytes = Encoding.UTF8.GetBytes(input);
  byte[] hashedBytes = provider.ComputeHash(inputBytes);

  StringBuilder output = new StringBuilder();

  for (int i = 0; i < hashedBytes.Length; i++)
    output.Append(hashedBytes[i].ToString("x2").ToLower());

  return output.ToString();
}
También hay que tener en cuenta que debemos importar el espacio de nombres System.Security.Cryptography.
using System.Security.Cryptography;

Algunos ejemplos
SHA256('') = 4574890e042bd574ae8d75562fe5bca34e7e5b518d9bbe2a7d5b39d1f6ed63c1
SHA256('SHA256') = b3abe5d8c69b38733ad57ea75e83bcae42bbbbac75e3a5445862ed2f8a2cd677

Nota: En este algoritmo he usado la clase StringBuilder para concatenar el resultado. En el caso del algoritmo MD5 este cambio refleja una mejoría de unos 100ms en caso que calculemos el hash 250.000 veces. Este mejoría es despreciable en caso que queramos calcular el hash para un solo registro. En caso del algoritmo SHA256 casi no presenta una mejoría ya que el porcentaje de tiempo concatenando la cadena es realmente despreciable comparado con el tiempo que lleva el calculo del hash.

Happy coding!

No hay comentarios:

Publicar un comentario