Funciones Resumen o Hash
1. Que son y como funcionan
Una función Hash toma como entrada un mensaje de cualquier
tamaño y, aplicando una serie de operaciones ariteméticas
y lógicas consigue otro mensaje, siempre de igual tamaño
y por lo general muy reducido, 128 o 160 bits por ejemplo. Para que la función
hash sea buena, una mínimo cambio en el mensaje de entrada, debe
producir un notable cambio en el de salida y, por supuesto, debe ser imposible
conocer el mensaje original a partir del mensaje resumen.
Esto nos puede servir si por ejemplo enviamos un correo electrónico
y queremos estar seguros de que nadie modifica su contenido. Si cuando
hemos escrito el correo, le aplicamos una función hash, producirá
un resumen que adjuntaremos con el correo. Cuando éste sea recibido
por los destinatarios, volverán a aplicar la misma función
hash al correo y comprobarán si coincide con el resumen adjuntado
por nosotros. Si coinciden, el mensaje no ha sido modificado en absoluto.
Si no lo hacen, es porque el correo que les ha llegado no es exactamente
igual al que nosotros hemos mandado. Sea cual sea el cambio (un carácter,
unas palabras, la omisión/adición de un texto) el resumen
producido variará enormemente del que había producido el
original. Y igual que lo aplicamos a un correo lo podemos aplicar a cualquier
tipo de documento.
Por otra parte, se puede pensar que si cualquier mensaje se resume
en unos ridículos 128 bits, como algunas funciones lo consiguen,
es muy grande la posibilidad de que dos mensajes distintos produzcan el
mismo mensaje. Con 128 bits (16 bytes, 16 caracteres) se consiguen 2^128
mensajes distintos: 3.40e+38, 38 dígitos, no es poco. Pero
16 caracteres para un mensaje si es poco, estos suelen ser bastante más
grandes, imaginemos uno de 200 bytes, 1600 bits. Se pueden escribir 4.44e481
mensajes distintos. 481 dígitos. Estadísticamente, el número
de mensajes que obtienen el mismo resumen tambiénm es enorme. Sin
embargo, pensemos que pocos mesajes de los tantos posibles escritos con
200 bytes, tendrían sentido. En principio porque en un mensaje no
suelen aparecer todos los caracteres posibles con 1 byte, 256, ni cualquier
combinación de éstos tiene sentido para una persona si se trata
de un texto o para el computador si el mensaje original era un objeto tratado
por éste. Las posibilidades se reducen de tal forma, que la probabilidad
de que dos mensajes con sentido obtengan un mismo hash se vuelve prácticamente
nula. De hecho, es principalmente esta improbabilidad lo que da calidad a
la función resumen.
El otro objetivo que debe cumplir una buena función hash es
la imposibilidad de obtener el mensaje original a partir del resumen.
Habrán veces que el resumen no se envíe con el original para
comprobar si ha variado su contenido, sino que se enviará solo
para cumplir otras funciones. Por ejemplo, imaginemos el acceso a un servidor
por web. Para que el acceso sea seguro decidimos encriptar el password
que el usuario escribe para entrar. Un buen método consiste en
que el servidor envíe un dato aleatorio, al cliente (al proceso
que pide la password al usuario), y a este dato junto a la contraseña
escrita por el usuario se les aplica un resumen que se enviará al
servidor. Puesto que éste conoce tanto el password correcto como
el dato aleatorio previamente enviado, comprobará el hash de ambos
con el que le llega desde el cliente. Si coinciden, el usuario escribió
correctamente la password. El dato aleatorio tiene su importancia ya que
sinó el método para acceder al servidor sería proporcionarle
el hash de una password válida. Si cada vez se usa un dato diferente,
el resumen conseguido nunca será igual, haciendo imposible que alguien
que lo haya leido consiga posteriormente acceder al servidor con ese resumen.
2. Ejemplos de funciones HASH
De entre las funciones hash más conocidas se encuentran la
MD5 o Message Diggest nº5, consiguiendo un resumen de tan
solo 128 bits y, el SHA1 y SHA2 Standard Hash Algorithm nº 1 y 2
que generan un resumen de 160 bits.
Veamos a continuación un ejemplo de como funcionan el MD5 y
el SHA1. Lo que escribamos en la área de texto será "resumido"
en los respectivos cuadors inferiores. Proponemos hacer varias pruebas,
cambiando en cada una un caracter respecto a la anterior y se observará
así el cambio producido en el resultado.
Agradecimientos.
Los scripts de las funciones hash MD5 y SHA1 han sido tomados de la página
http://pajhome.org.uk/crypt/md5