Calcular Valores Hash con System.Security.Cryptography c#

El articulo explica como calcular el Hash a un archivo o cadena de texto descargue el código fuente del siguiente link  

Download Código fuente en visual Studio 2008

INTRODUCCION

En informática, Hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.

El FrameWork de Microsoft .NET proporciona un amplio soporte para funciones Hash.

El espacio de nombres System.Security.Cryptography, contiene las clases para manejar los algoritmos Hash soportados.

Los más usados actualmente son MD5 y SHA.

La siguiente tabla describe los algoritmos más utilizados en el Framework de Microsoft .NET

Algoritmo

Descripción

SHA1

SHA-1 ha sido examinado muy de cerca por la comunidad criptográfica pública, y no se ha encontrado ningún ataque efectivo. No obstante, en el año 2004, un número de ataques significativos fueron divulgados sobre funciones criptográficas de hash con una estructura similar a SHA-1; lo que ha planteado dudas sobre la seguridad a largo plazo de SHA-1.

SHA-0 y SHA-1 producen una salida resumen de 160 bits de un mensaje que puede tener un tamaño máximo de 264 bits, y se basa en principios similares a los usados por el profesor Ronald L. Rivest del MIT en el diseño de los algoritmos de resumen de mensaje MD4 y MD5.

La codificación hash vacía para SHA-1 corresponde a:

SHA1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709

MD5

MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT.

La codificación del MD5 de 128 bits es representada típicamente como un número de 32 dígitos hexadecimal. El siguiente código de 28 bytes ASCII será tratado con MD5 y veremos su correspondiente hash de salida:

MD5("Esto sí es una prueba de MD5") = e99008846853ff3b725c27315e469fbc

SHA256

La función SHA256 funciona en un bloque de mensajes de 512 bits y un valor Hash intermedio de 256 bits. Es esencialmente un algoritmo de cifrado de bloques de 256 bits que cifra el valor intermedio usando el bloque del mensaje como llave.

SHA512

La función SHA512 funciona en un bloque de mensajes de 1024 bits y un valor Hash intermedio de 512 Bits. Es esencialmente un algoritmo de cifrado de bloques de 512 bits que cifra el valor intermedio usando el bloque del mensaje como llave.

SHA384

Se define de la misma manera que el SHA512, con dos excepciones: el valor inicial y en que el final es truncado en menos de 384 bits.

 

Este artículo contiene el link para la descarga Download del código ente del proyecto que explico a continuación:  

Configuración del algoritmo para calcular  hash

Configuré el proveedor del algoritmo Hash leyendo el archivo de configuración web.config y  utlizando un proveedor de los de la tabla antwerior crea una instancia de la clase CalcularHash, heredando los métodos necesarios para calcular el valor Hash de archivos y cadenas de texto.

private CalcularHash objCalcularHash;

EnumAlgoritmoHashs tipoAlgoritmoHast;

 

    private void ConfigurarProveedorHash()

    {

string strAlgorithmForHashing = ConfigurationManager.AppSettings["HashCalculationAlgorithm"].ToString();

tipoAlgoritmoHast = EnumAlgoritmoHashs)Enum.Parse(typeof(EnumAlgoritmoHashs), strAlgorithmForHashing, true);

       this.objCalcularHash = new CalcularHash();

    }

Ejecutar Hash

Para calcular Hash utilice los respectivos métodos heredados de la clase:

String HashCalculado = this.objCalcularHash.CalcularCadenaHash("Hola Mundo", tipoAlgoritmoHast);

 

CLASE CalcularHash

La clase CalcularHash calcula los valores Hash de cadenas y archivos para seleccionar el algoritmo de cifrado se realiza mediante la enumeración EnumAlgoritmoHashs. A continuación el código de la clase y su documentación en lenguaje c#.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;

using System.IO;

 

namespace Hash

{

/// Identifica los tipos de Algorítmo usados para

/// generar el codigo Hash

/// </summary>

public enum EnumAlgoritmoHashs

{

MD5,

SHA1,

SHA256,

SHA384,

SHA512

}

 

/// <summary>

/// Permite calcular valores Hash de cadenas y archivos.

/// </summary>

public class CalcularHash

{

  #region "Public Methods"

  /// <summary>

/// Calcula el valor Hash para la cadena pasada como parámetro.

/// </summary>

/// <param name="cadena">Cadena a procesar.</param>

/// <param name="alg">Algoritmo que vamos a utilizar.</param>

/// <returns>Cadena representando el valor Hash Obtenido.</returns>

public string CalcularCadenaHash(string Cadena, EnumAlgoritmoHashs Alg)

{

// del algoritmo seleccionado obtenemos un proveedor de cifrado.

HashAlgorithm hash = GetHashProvider(Alg);

// obtenemos un array de bytes de los caracteres dentro de la cadena.

byte[] tempSource = Encoding.ASCII.GetBytes(Cadena);

 

// el método ComputeHash calcula el valor Hash y devuelve un array de bytes.

// convertimos el array a string antes de devolverlo.

return ByteArrayToString(hash.ComputeHash(tempSource));

}

/// <summary>

/// Calcula el valor Hash del archivo pasado como parámetro.

/// </summary>

/// <param name="filename">Nombre completo del archivo a procesar.</param>

/// <param name="alg">Algoritmo que vamos a utilizar.</param>

/// <returns>Cadena representando el valor Hash del archivo.</returns>

public string CalcularArchivoHash(string NombreArchivo, EnumAlgoritmoHashs Alg)

{

// del algoritmo seleccionado obtenemos un proveedor de cifrado.

HashAlgorithm hash = GetHashProvider(Alg);

// creamos un objeto stream con el archivo especificado.

FileStream fs = new FileStream(NombreArchivo, FileMode.Open, FileAccess.Read);

 

// el método ComputeHash calcula el valor Hash del flujo

// que representa al archivo. convertimos el array a string y lo asignamos

// a una variable

string resul = ByteArrayToString(hash.ComputeHash(fs));

fs.Close(); // importante!! cerramos el flujo.

 

return resul; // devolvemos el valor de la variable de cadena.

}

 

#endregion "Public Methods"

 

#region "Metodos privados"

/// <summary>

/// Convierte un Array de bytes en una cadena de caracteres.

/// </summary>

/// <param name = "byteArray">Byte array origen.</param>

/// <returns>Cadena de caracteres obtenida del array.</returns>

private string ByteArrayToString(byte[] ByteArray)

{

// usamos un objeto stringbuilder por su mejor rendimiento con operaciones

// de cadenas.

StringBuilder sb = new StringBuilder(ByteArray.Length);

 

// por cada byte en el array

for (int i = 0; i < ByteArray.Length; i++)

{

// obtenemos su valor hexadecimal y lo agregamos al objeto

// stringbuilder.

sb.Append(ByteArray[i].ToString("X2"));

}

 

// devolvemos el objeto stringbuilder, formateado a string

return sb.ToString();

}

/// <summary>

/// Obtiene un proveedor HashAlgorithm de la enumeración utilizada.

/// </summary>

/// <param name="alg">Algoritmo seleccionado.</param>

/// <returns>Proveedor Hash correpondiente al algoritmo deseado.</returns>

private System.Security.Cryptography.HashAlgorithm GetHashProvider(EnumAlgoritmoHashs Alg)

{

switch (Alg)

{

case EnumAlgoritmoHashs.MD5:

return new MD5CryptoServiceProvider();

case EnumAlgoritmoHashs.SHA1:

return new SHA1Managed();

case EnumAlgoritmoHashs.SHA256:

return new SHA256Managed();

case EnumAlgoritmoHashs.SHA384:

return new SHA384Managed();

case EnumAlgoritmoHashs.SHA512:

return new SHA512Managed();

default: // sino se ha encontrado un valor correspondiente en la

// enumeración, generamos un excepción para indicarlo.

throw new Exception("Invalid Provider.");

}

 

#endregion "Metodos privados"

}

}

    

CODIGO FORMULARIO WINDOWS

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Configuration;

 

namespace Hash

{

public partial class Ejemplo : Form

{

private CalcularHash objCalcularHash;

EnumAlgoritmoHashs tipoAlgoritmoHast;

 

public Ejemplo()

{

InitializeComponent();

ConfigurarProveedorHash();

}

    private void ConfigurarProveedorHash()

    {

string strAlgorithmForHashing = ConfigurationManager.AppSettings["HashCalculationAlgorithm"].ToString();

tipoAlgoritmoHast = (EnumAlgoritmoHashs)Enum.Parse(typeof(EnumAlgoritmoHashs), strAlgorithmForHashing, true);

    this.objCalcularHash = new CalcularHash();

}

 

private void btnCalcularHash_Click(object sender, EventArgs e)

{

txtCalculadoHash.Text = this.objCalcularHash.CalcularCadenaHash(txtValor.Text, tipoAlgoritmoHast);

}

}

}

    

INTERFAZ GRAFICA DE LA APLICACIÓN

Utilizo un proyecto Windows para .net en una caja de texto está el usuario digita el valor de la cadena de texto para calcular el Hash y en la otra caja de texto muestro el valor del hash que esta almacenado en el archivo de configuración App.config cuando ejecuto el botón Calcular Hash

<appSettings>

<!– Admit values for key: HashCalculationAlgorithm :MD5,SHA1,SHA256,SHA384,SHA512–>

<add key="HashCalculationAlgorithm" value="SHA1"/>

</appSettings>

            

About omaracostacasas

ING SOFTWARE
This entry was posted in Microsoft .NET. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s