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.
Published 12/12/2006 16:57 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2006/12/12/criptograf-237-a-net-funcionalidad-hash.aspx

Comentarios

# re: Criptografía .NET : Funcionalidad Hash

hmmm...

Quisiera preguntar una cosa que yo nunca he terminado de entender. Si un intruso entra en tu base de datos (entendemos por "entrar" el hecho de poder lanzarle consultas SQL y ver su resultado), ¿qué más da que lo que tú tengas en el campo Password de una base de datos sea la contraseña "tal cual", o el hash digest de la misma? Como si quieres tener una imagen holográfica tridimensional. Da lo mismo. Lo que el hacker necesita, es JUSTAMENTE el valor que hay almacenado en el campo, sea el que sea.

Te hago un ejemplo con lo que decías de la huella digital: Hay dispositivos (incluso para PC) que permiten logearse en un sistema con la huella digital, sin contraseñas. Hasta aquí bien, ¿no?

Vale, pues... ¿y si yo consigo EL DEDO de una persona autorizada?

Pues resulta que ya puedo entrar a donde quiero entrar.

No sé si se entiende lo que quiero decir: Si te entran "hasta la cocina", es decir si alguien consigue entrar en tu base de datos... Si lo único que tienes encriptado es la contraseña, no te sirve absolutamente de nada. Lo ideal sería encriptar la mayor cantidad posible de información. Claro que entonces no se podría utilizar un algoritmo indescifrable como el hash, no?  ;)

Wednesday, December 13, 2006 9:03 AM por PabloNetrix

# re: Criptografía .NET : Funcionalidad Hash

Hola,

Claro, en el post me refiero más al acto de un logeo más seguro mediante generación de hash y usándose para compararlo conel valor hash que se encuentre en la Db para ese usuario,.

Ahora bien,  muchos usuarios usan una misma contraseña para logearse en varios sistemas, es así que, si un intruso logra saber la contraseña este podrá usarlo, obviamente para entrar en el sistema cuantas veces quieray obtener la información que desee,

Por otro lado, es más seguro guardar un valor hash en la DB que almacenar la misma contraseña, el hash digest al estar formado por un string de 28 digitos lo hace más seguro pero por supuesto no al 100%. Es más tienes razón al decir, ¿qué pasa si me consigo esta "huella digital"?, pos no podrás entrar, ya que el sistema te pedirá la contraseña para que a partir de este se genere el valor hash que será enviado a la DB, y si hay coincidencia del valor hash para este usuario ps habrá sido exitoso el logeo.

No podemos encriptar toda la información de la DB ya que esto implica más trabajo para el motor DB cuando desees ver la información correspondiente, es decir, estar descrifrando (o en todo caso desencriptando) cada ves que necesites realizar algo.

Hablaba en este post, de como tratar la seguridad en el punto inicial de acceso al sistema, que sería el autenticarse, sí y sólo sí se consigue la clave entonces podrás ingresar al sistema, si tienes el valor hash o la huella digital, ps simplemente no te servirá, ya que no te revelará detalles.

Wednesday, December 13, 2006 2:05 PM por Percy Reyes

# re: Criptografía .NET : Funcionalidad Hash

Percy, el tema es así, uno guarda en un campo BLOB el valor del password obviamente hasheado, tu tienes que tener una semilla que te permite la encodificación y descodificación a nivel de tu aplicación, casi siempre es una aplicación externa a tu sistema de autenticación.

Luego te paso un modelo de DB que vi una vez.

Wednesday, December 13, 2006 2:39 PM por Zeitan

# re: Criptografía .NET : Funcionalidad Hash

Hola, Pablo.

La seguridad de login de este sistema reside en que aunque accedan a la base de datos y consigan ver el valor de la contraseña encriptado, de poco les va a servir para validarse en la aplicación. Cada vez que se valida alguien se obtiene el hash de la contraseña que es lo que se compara con lo que hay en la BD. Por lo que, a menos que se tenga el valor original de la contraseña no podrán acceder.

Monday, December 18, 2006 9:30 AM por iAtreyu

# re: Criptografía .NET : Funcionalidad Hash

Consulta: por lo que entiendo  a partir de la contraseña, genera un valor hash, este valor es grabado en una base de datos. Si un hacker entra a la base de datos puede ver la informacion de hash, pero se dice que es mas seguro por que no tiene la contraseña y no le serviria el valor hash. Que pasaría si el hacker cambia el valor hash almacenada en la bd por uno generado por el mismo. entra o no al sistema? ademas seria mas sencilla por que no tendria que descifrar nada?. Espero su respuesta  .

Gracias

Monday, December 18, 2006 6:41 PM por Juan

# re: Criptografía .NET : Funcionalidad Hash

claro, los passwords hasheados se almacenan en la DB,...-

si un intruso al entrar al sistema cambia un valor hash por el suyo, ps entonces podrá entrar al sistema más adelante, ya que el intruso sabrá la cadena del cual se creo dicho hash, y eso basta!,

espero haberme dejado entender!,

Monday, December 18, 2006 8:34 PM por Percy Reyes

# # re: Criptografía .NET : Funcionalidad Hash

Para estos casos lo que se hace es antes de generar el valor hash realizar algunas sencillas operaciones con la cadena de entrada del usuario (como por ejemplo concatenarla con algún número) y después generar el hash, de esta forma ya puede poner el valor hash que quiera en la BD, que no podrá validarse en el sistema.

Friday, January 05, 2007 1:27 PM por Pery

# re: Criptografía .NET : Funcionalidad Hash

Hola Pery,

tienes razón, de esa manera se evita algunas coincidencias en los valores hash !! :)

Percy Reyes.

Friday, February 09, 2007 8:23 PM por Percy Reyes

# re: Criptografía .NET : Funcionalidad Hash

Hola.

Respondiendo a las dudas de PabloNetrix.

En una base de datos de usuarios de un sistema se DEBE almacenar por seguridad la representación de la contraseña y NUNCA la contraseña en texto plano.

El hacerlo de esa manera nos obliga a utilizar un protocolo de autenticación que fortalecerá por mucho la seguridad de un sistema dado.

Ahora, el hecho de utilizar este tipo de protocolos donde el cliente se autentica enviando una contraseña (algo que se sabe) y el servidor ratitifa su identidad realizando la transformación de la contraseña a un hash y compara el resultado con su base de datos no sirve de nada si previamente este protocolo expone los datos intercambiados por la red en claro (sea por HTTP o por conexiones a las bases de datos en claro). Para ello es necesario integrar mecanismos de cifrado de datos a nivel de red o a nivel de sistema operativo.

Al utilizar hashes, el servidor (en otras palabras los administradores del sistema) tampoco podrán conocer de forma directa la contraseña, permanecerá de cierta forma confidencial.

Sin embargo, si de entrada las contraseñas son débiles (cortas o derivadas de palabras comunes) será facil obtener estas a partir de los hashes mediante un ataque de fuerza bruta o de diccionario y más aún si no existen restricciones para montar un ataque directamente sobre el sistema, por ejemplo, 3 intentos de inicio de sesión fallidos en un lapso definido de tiempo, etc. Consulten la herramienta hydra.

La recomendación es integrar un modulo de validación de complejidad y longitud mínima de contraseñas en sus sistemas.

Espero que estos comentarios les sirvan para tener un panorama más amplio de la estructura y funcionamiento de los sistemas de autenticación.

f3r

Saturday, April 25, 2009 8:25 AM por f3rn4nd0