Los hash o funciones de resumen son algoritmos que consiguen crear a partir de una entrada (ya sea un texto, una contraseña o un archivo, por ejemplo) una salida alfanumérica de longitud normalmente fija que representa un resumen de toda la información que se le ha dado (es decir, a partir de los datos de la entrada crea una cadena que solo puede volverse a crear con esos mismos datos).
Estas funciones no tienen el mismo propósito que la criptografía simétrica y asimétrica, tiene varios cometidos, entre ellos está asegurar que no se ha modificado un archivo en una transmisión, hacer ilegible una contraseña o firmar digitalmente un documento.
Características de los hash
En definitiva las funciones hash se encargan de representar de forma compacta un archivo o conjunto de datos que normalmente es de mayor tamaño que el hash independientemente del propósito de su uso.
Este sistema de criptografía usa algoritmos que aseguran que con la respuesta (o hash) nunca se podrá saber cuales han sido los datos insertados, lo que indica que es una función unidireccional. Sabiendo que se puede generar cualquier resumen a partir de cualquier dato nos podemos preguntar si se podrían repetir estos resúmenes (hash) y la respuesta es que teóricamente si, podría haber colisiones, ya que no es fácil tener una función hash perfecta (que consiga que no se repita la respuesta), pero esto no supone un problema, ya que si se consiguieran (con un buen algoritmo) dos hash iguales los contenidos serían totalmente distintos.
Ejemplos y formas de uso
Las funciones hash son muy usadas, una de las utilidades que tiene es proteger la confidencialidad de una contraseña, ya que podría estar en texto plano y ser accesible por cualquiera y aún así no poder ser capaces de deducirla. En este caso, para saber si una contraseña que está guardada, por ejemplo, en una base de datos es igual a la que hemos introducido no se descifra el hash (ya que debería de ser imposible hacerlo) sino que se aplicará la misma función de resumen a la contraseña que especificamos y se comparará el resultado con el que tenemos guardado (como se hace con las contraseñas de los sistemas Linux).
Pongamos un ejemplo, la función hash MD5 es una de estas funciones de resumen y la usaremos para resumir el siguiente texto:
Genbeta Dev
Y aplicaré la función de resumen con el comando especifico que tienen la mayoría de sistemas basados en Linux (md5sum
):
pedro@ubuntu:~$ md5sum
Genbeta Dev
b71dada304875838f0263e3ae50c2c49 -
Por lo que la última línea es la del hash, que podéis comprobar en un terminal, en una herramienta online o con una aplicación con este fin, aunque se puede aplicar en muchos lenguajes de programación que lo implementan (no solo esta función, sino también otros tipos como el SHA que puede admitir distinta longitud).
Asegurar la integridad de la información
Otro uso que tiene esta función es la de garantizar la integridad de los datos y es algo que habréis visto muchas veces, por ejemplo en algunas webs que proporcionan descargas de archivos grandes, por ejemplos software, dando junto a su vez el resumen del archivo y la función usada.
Por poner un ejemplo en la página de descarga de Virtual Box podemos encontrar esta página con todos los resúmenes de las descargas disponibles con los que podemos comprobar que el archivo se ha descargado correctamente y que nadie ha modificado su contenido durante la transmisión.
Para poner en práctica este uso cogeré esta imagen de HTML5 y le aplicaré una función de resumen con el algoritmo MD5.
Y el resultado de hacer el resumen es el siguiente, usando otra vez la función presente en sistemas Linux (md5sum
).
pedro@ubuntu:~$ md5sum HTML5.png
cc617bf6a1ec75373af6696873fccef1 HTML5.png
Este es el método para saber que un documento está integro tras su recepción, por eso se usa para comprobar que un archivo se a descargado correctamente o para comprobar que datos como un pequeño texto sigue siendo el mismo tras su emisión.
Firma digital
Firmar un documento no es algo novedoso, pero la firma digital si lo es un poco más y nos ayuda a verificar la identidad del emisor de un mensaje (así nos podemos asegurar que nuestro jefe nos manda un archivo concreto y no es el vecino que nos gasta una broma).
El método más simple de firma digital consiste en crear un hash de la información enviada y cifrarlo con nuestra cave privada (de nuestro par de claves de la criptografía asimétrica) para que cualquiera con nuestra clave pública pueda ver el hash real y verificar que el contenido del archivo es el que hemos mandado nosotros.
Me voy a adelantar al próximo capítulo sobre criptografía y hablaré un poquito de GnuPG (GPG) que es una herramienta de cifrado que nos permite firmar documentos, en este caso lo haré con una firma en texto plano (es un sistema menos seguro pero veremos que es lo que hace).
Lo que voy a hacer es firmar la imagen que hemos usado antes (la de HTML5) con el siguiente comando en una terminal de Linux (para otras plataformas hay otras soluciones muy similares o incluso idénticas):
pedro@ubuntu:~$ gpg --clearsign HTML5.png
Necesita una frase contraseña para desbloquear la clave secreta
del usuario: "Pedro Gutiérrez Puente (Clave pública) <info@xitrus.es>"
clave DSA de 3072 bits, ID 783F3E6D, creada el 2012-12-11
Automáticamente a partir del archivo HTML5.png
nos genera el archivo HTML5.png.asc
que si lo abrimos con un visor de texto vemos el contenido de la imagen (un conjunto de caracteres sin sentido) y al final del archivo el siguiente texto (que contiene el hash cifrado):
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iF4EAREIAAYFAlD0vH0ACgkQJQ5Gcng/Pm1gDgD+PnXZfni9n90duv2ir0hdnWdp
1bpBHGzCNWxN8q5I8CoA/RsdMeMxY9kwOx/y8jnxQYDjWFiBRThiE7GSxTtvXUPf
=PwS6
-----END PGP SIGNATURE-----
Resumen
Junto con este artículo sobre los hash tenemos el que habla sobre los tipos de criptografía (simétrica y asimétrica) que son la base para comprender el siguiente y último de la serie sobre criptografía, donde pondremos en práctica estos conceptos junto a GPG.
En Genbeta Dev | Criptografía
Ver todos los comentarios en https://www.genbeta.com
VER 0 Comentario