Criptografía .NET : Funcionalidad Hash
Hash es un tipo de criptografía en una sola dirección o sentido (cifrado irreversible), es decir, no admite proceso de descrifrado. Por otro lado, un proceso hash admite entradas de tipo string, este proceso devuelve un número de tamaño fijo (160 bit - 20 bytes), a este número se le conoce como hash digest. Un hash digest es imposible de descifrar!.
Un hash digest es como la huella digital de una persona, usada sólo para identificarla sin revelar detalles de la misma, en este sentido, los hash digest ofrecen la funcionalidad para verificar contraseñas, en consecuencia, no es necesario almacenar las contraseñas en la database, en vez de esto se almacenará la "huega digital" de la mismas. Después, al momento de logearnos ante el sistema, la contraseña será verificada en la database usando el respectivo valor hash. En la base de datos estarán almacenadas sólo los hash digest más no las contraseñas!, todo esto se justifica en lo siguiente: una contraseña es usada para procesos de autenticación,entonces no hay razones válidas para almacenarlas en la base de datos, en lugar de ellas, un hash digest de cada contraseña será almacenada.
Esto es muy útil y muchas veces la única solución para algunas situaciones como por ejemplo, si un intruso logra acceder a la base de datos,este no podrá sacarle provecho ya que no encontrará más que hash digests en la database. Estos valores no le servirán de nada!, lo que al intruso le importa son las contraseñas legibles o por lo menos descrifrables, es decir, información relevante. En este escenario, los hash digest es el mecanismo "ideal" de seguridad.
Después de tanto rollo, paso a dejarles un aplicación básica que crea un valor hash. Este valor es lo que se utiliza para autenticarse, pero en este caso, sólo mostraremos en la consola.
using System;
using System.Security.Cryptography;
namespace HashDigestApp
{
class Program
{
static void Main(string[] args)
{
//string que cifraremos,
String str = "contraseña";
//strBytes contiene el valor hash(48 numeros).
Byte[] strBytes = new UnicodeEncoding().GetBytes(str);//codificamos el string,
//SHA1CryptoServiceProvider para generar el valor hash
//usamos el algoritmo de cifrado SHA1
strBytes= new SHA1CryptoServiceProvider().ComputeHash(strBytes);
//hash digest encodificado en base 64 (uso común, más legible)
//el valor encodificado será almacenado en la DB,
Console.WriteLine("\nEncodificado en base 64 - 28 caracteres");
//pero en este caso, sólo imprimos en la consola.
Console.WriteLine(Convert.ToBase64String(strBytes));
Console.ReadLine();
}
}
}Como ya dije, una vez generado el valor hash, se toma dicho valor para verificar la contraseña contra la database, si existe dicho calor hash en la base de datos, entonces el proceso de autenticación fue correcto. Este post sólo intenta para dar a conocer la utilidad e importancia de uno de los muchos mecanismos de autenticación usando valores hash. Nos vemos.