Has escuchado la palabra HASH alguna vez y no tienes muy claro qué es y que utilidad puede tener. Si es así sigue leyendo.

¿Qué es el HASH?

Un HASH es una firma, una cadena corta, de longitud fija, obtenida como resultado de aplicar un algoritmo o función HASH a un conjunto mayor y variable de elementos, generalmente un fichero. La salida generada por el algoritmo es una cadena que representa de forma única el origen.

mmmmm, quizá no queda claro.

Veamos un ejemplo.

 

Aplico la función HASH a la fotografía archivoimagen.jpg y obtengo como resultado la cadena EGSGG85DGE76 o sobre la cadena de texto «Hola Altaruru» y obtengo AT74EGDD72KS, otra cadena.

Y esto… ¿para que sirve?

Entre otras aplicaciones, permite detectar y eliminar archivos duplicados, dar nombre único a los ficheros, detectar si un archivo se ha modificado, verificar que el archivo descargado desde una web es el original y seguro, codificar contraseñas…

El HASH es un algoritmo de un único sentido, eso significa que puedo calcular el HASH a partir de una cadena o un archivo, pero no puedo volver a generar dicho archivo desde su HASH.

Ofuscando Contraseñas

Si quiero almacenar contraseñas lo lógico es no dejarlas visibles, ofuscarlas. No guardo el texto de la contraseña, en su lugar calculo y almaceno el HASH. ¿Como se si la contraseña introducida es la correcta? volviendo a calcular el HASH del texto introducido por el usuario durante el login y comparándolo con el almacenado previamente.

  • Ejemplo, mi contraseña es: «felizdianamaste2018
  • El HASH resultante es: a317891d0025956ad7f49d084db006be
  • En mi sistema guardo ese hash, si alguien accede verá dicho hash pero no la contraseña.
  • Cuando el usuario introduzca contraseña codifico el texto, si coincide con a317891d0025956ad7f49d084db006be es correcta.
Gestión Documental

Los gestores documentales o de contenido calculan el HASH al comenzar a tratar un fichero, así conocen si ya existe en su sistema, el tratamiento es distinto si es una nueva entrada o por el contrario, ya existe en el sistema.

  • Si es una nueva entrada, tendrá que copiar el nuevo archivo en su repositorio.
  • Extraer información relevante del archivo y asociarla al mismo
    • Tamaño
    • Propietario
    • Fecha Creación
    • Tipo de archivo
      • En función del tipo, dimensiones, color, datos EXIF, duración
      • Extraer contenido, indexar…
Control de duplicados

Puedo tener varias fotos cuyo archivo se llame DSC_3933.JPG ¿serán copias del mismo archivo o imágenes distintas obtenidas de diversas fuentes? Si calculo el HASH y comparo resultados saldré de dudas.

  • /home/altaruru/Imágenes/DSC_3931.JPG  -> e2b8200d5e85ca5674a6d0254acd15ce
  • /home/altaruru/Imágenes/backup2017/DSC_3931.JPG  -> e2b8200d5e85ca5674a6d0254acd15ce
  • /home/altaruru/Imágenes/camara/DSC_3931.JPG -> 0db0a0531464b1724d9e55e6860bcc3e

Vemos que los dos primeros coinciden por lo que es la misma imagen, en cambio el tercero, pese a llamarse igual tiene otro HASH, por lo que el contenido es distinto, es otra imagen.

Control de cambios

Tengo un documento y quiero asegurarme que no se ha modificado. A simple vista puede ser difícil cuando es un texto de varias páginas, o una hoja de cálculo. Puedo calcular el HASH y guardarlo después de modificar el archivo. Para comprobar si se ha modificado basta con calcular de nuevo el HASH y compararlo con el guardado previamente, deben ser iguales, si no lo son, alguien ha modificado el documento.

En la siguiente imagen vemos que el HASH calculado el día 27 de Septiembre coincide con el del día 28, sin embargo el resultado del 1 de Octubre es diferente, eso indica que el archivo ha sido modificado.

 

Implementaciones

Hay muchas implementaciones CRC, MD2, MD4, MD5, SHA1, Tiger, Snefru, RipeMD, Whirlpool, cada una de ellas da resultados distintos. Es por ello que al comparar es importante utilizar la misma implementación.

Vemos que el resultado de aplicar MD5 y SHA256 al mismo texto da resultados diferentes:

Texto: «hola Altaruru, hoy es lunes 1 de Octubre de 2018»

MD5: 2ee97007c2d0d7e15310c6131e34e388
SHA256: fa3cccc718c7598ddc909a8e2dc7cb8e2d0179164a965b293f6b681b9f78f2bb

En mi caso suelo utilizar MD5, es de fácil implementación y uno de los más extendidos, aunque para gustos los colores.

 

Si necesitas implementar el cálculo del hash o sientes curiosidad no dejes de ver Calculando el HASH en Python

Saludos!