Introducción

La palabra hash es usada en el mundo de la informática para describir a una cadena de texto codificada. Una cadena formada por número y letras de longitud fija y en un orden único e irrepetible que representan a una serie de datos. Esta cadena de texto es creada gracias a una función criptográfica única conocida como función hash.

Ahora bien ¿Qué importancia tienen los hashes en la actualidad? ¿Cuál es la historia? ¿Qué funciones hash existen en la actualidad? Pues bien, todo esto y mucho más lo conoceremos a continuación.

Origen de los hashes

El uso de los hashes se remonta a los inicios de la electrónica y la informática. En el año de 1.953, el investigador de IBM, Hans Peter Luhn propuso una forma de buscar y validar rápidamente información y documentos que se transformaría en lo que hoy llamamos función resumen o hash.

Luego de este trabajo inicial, se produjo una intensa investigación que dio origen al trabajo Indexing for rapid random-access memory, presentado por Arnold I. Dumey en 1.956. Finalmente el investigador W.W. Peterson trabajo en una aproximación práctica en 1.957 y en 1961, Peterson creó la primera función hash conocida, la Cyclic Redundancy Check (Comprobación de Redundancia Cíclica) o CRC.

El objetivo de esta función era la de comprobar los datos transmitidos en redes y en sistema de almacenamiento digital. En ese entonces, su uso estaba bastante limitado a espacios académicos y militares. Pero su utilidad rápidamente permitió la expansión de la misma a la industria civil. Así en la actualidad CRC es la función más usada en el mundo y podemos verla implementada en casi todo aparato electrónico que existe en la actualidad.

Con el avance tecnológico de los años 70 y 80, especialmente en informática y computación, los investigadores comenzaron a investigar más sobre este tipo de funciones. En 1973, se presentó el trabajo The Art of Computer Programming, de D. E. Knuth y seguidamente G. D. Knott presentó Hashing Functions en 1.975. Ambos libros sentaban las bases para el diseño de funciones hash en sistemas informáticos. Finalmente 1.977,  J. Lawrence Carter y Mark N. Wegman  propusieron The Universal hash functions o las definiciones que Ralph Merkle pública en 1.979.

Todo este trabajo teórico se transforma en 1989 en la primera función hash diseñado específicamente para computadores, la función MD2, creada por Ralph Merkle. Fue acá donde comenzó la verdadera revolución de las funciones hash hasta nuestros días.

¿Cómo funciona esta tecnología?

Una función hash trabaja en base a tomar una serie de datos que son organizados en una serie de bloque de datos. Estos bloques de datos son luego sometidos a una serie de procesos matemáticos y lógicos. La finalidad de estos procesos es transformar todos los bloques de datos en una cadena alfanumérica única, irrepetible y de longitud. En dicha cadena se plasma toda la información de los bloques de datos sometidos al proceso de hashing.

Dicho de una forma más sencilla, esta función lo que hace es resumir una gran cantidad de datos en una cadena mucho más pequeña, irrepetible y con una longitud fija. De allí a que estas funciones sean también conocidas como funciones de resumen o funciones de verificación.

Este funcionamiento presenta una enorme ventaja. Y es que, el proceso de hashing solo puede hacerse en un sentido. Es decir, es imposible obtener los datos originales de los bloques teniendo tan solo el resultado en nuestras manos. Gracias a esto es posible crear un documento digital, someterlo a un proceso de hashing y usar dicho resultado como una prueba de autenticidad y no modificación. Esto pues cualquier modificación que hagamos en el documento dará como resultado un hash distinto y podremos darnos cuenta de la manipulación del mismo.

Pero ¿Qué tan seguras son estas funciones? Bien eso lo veremos en la siguiente sección.

Seguridad en las funciones hash

Una de las principales razones que nos llevaron a desarrollar estas funciones era conseguir un medio que garantizara la seguridad de la información digital. Esto significa que dichas funciones debían ser también muy seguras para evitar que un hacker pudiera romperlas y así alterar la información que estas pudieran proporcionar.

Esto se logró usando una aproximación muy cercana a la criptografía, tanto así, que se usan prácticamente los mismos principios para desarrollar funciones hash. Si bien, la seguridad absoluta no existe, pero las funciones hash actuales son muy seguras y confiables.

Por supuesto, existen funciones más seguras que otras. Especialmente cuando hablamos de funciones certificadas o bien estudiadas como el caso de SHA-256 o SHA-512. Pero en todos los casos, la seguridad de las funciones hash actuales garantiza que nadie podrás saltarse su seguridad.

Un ejemplo de esto es SHA-256, una función muy utilizada en la actualidad y que es catalogada como muy segura. Para que un hacker logre romper SHA-256 necesitaría un enorme poder computacional. Tanto que ni todas las supercomputadoras del mundo le bastarían para lograrlo en un corto periodo de tiempo. Si en lugar de SHA-256, nombramos funciones como SHA-3 (Keccak), Blake3 o Scrypt este nivel de seguridad aumenta exponencialmente.

Características de las funciones hash

Una de las principales características de las funciones hash es que estas no son reversibles. Esto significa que un hash no puede convertirse en la serie de datos que dieron origen al mismo. Esta imposibilidad de obtener el mensaje original a partir del resumen obtenido se puede explicar con la aritmética modular (mod). Y es que estos deben ser computacionalmente fáciles y rápidos de obtener.

Por otro lado, los hashes ofrecen la capacidad de ser altamente resistentes a las colisiones. Es decir, dos series de datos distintos no pueden dar origen a un mismo resultado. Esto garantiza que las funciones siempre den como resultado cadenas de textos únicas e irrepetibles bajo cualquier condición.

Otra de las características elementales de los hashes es que el resultado de sus funciones tiene una longitud fija. Las funciones hash dependiendo de su construcción ofrecerán resultado de 16, 32, 48, 64, 128, 256 o más caracteres fijos.

Todo esto tiene un importante impacto en la usabilidad. Especialmente cuando hablamos de verificación, autenticación y manejo de integridad de datos.  Lo mejor de todo, es que la mayoría de estas funciones son de dominio público y sus implementaciones son software libre.

Funciones hash en la actualidad

En la actualidad existen varias funciones hash completamente útiles y con amplia difusión, entre estas podemos mencionar:

MD5

Esta es una antigua función muy utilizada en los principios de Internet. MD5 era el estándar para realizar hash de casi cualquier cosa en Internet pasando por contraseñas, archivos de descarga y la verificación de conexiones seguras usando SSL. Sin embargo, el uso de MD5 cayó en el olvido tras darse a conocer las primeras colisiones del algoritmo. Una colisión es cuando dos grupo de datos distintos generan un mismo resultado. Una situación inaceptable y que abre las puertas para romper la función. En la actualidad, muy pocos sitios web la siguen usando para crear hash de verificación para descargas. La función MD5 da como resultado una cadena de texto compuesta por 32 caracteres.

Por ejemplo, un archivo de texto que tenga la siguiente cadena de texto "Hola mundo!" dará como resultado lo siguiente:

29942b059fbe9d580f1860c559491830

SHA-1

SHA-1 fue la primera versión de una familia de funciones conocida como SHA (Secure Hash). Esta primera versión se implementó en 1995 con el objetivo de sustituir a MD5 como estándar de seguridad. La función fue considerada segura hasta 2017 cuando Google presentó evidencia de la primera colisión de SHA-1. Desde entonces, el uso de SHA-1 se ha ido reduciendo. La función hash SHA-1 da como resultado una cadena de texto compuesta por 40 caracteres.

Por ejemplo, un archivo de texto que tenga la siguiente cadena de texto "Hola mundo!" dará como resultado lo siguiente:

78478919cdb0edece11c15b5d3666bfc3db946d7

SHA-256

Esta es una de las funciones que pertenecen a la familia SHA. SHA-256 es considerado en la actualidad el hash estándar de la industria. Considerado como muy seguro, SHA-256 es capaz de ofrecernos una alta seguridad requiriendo de muy poco poder de cómputo. Por esta razón, Satoshi Nakamoto eligió SHA-256 como algoritmo para la creación de la criptomoneda Bitcoin. Una función SHA-256 da como resultado una cadena de texto compuesta por 64 caracteres.

Por ejemplo, un archivo de texto que tenga la siguiente cadena de texto "Hola mundo!" dará como resultado el siguiente hash SHA-256:

226d3bded5198fb5f2a79c3d72e704e5fe8e8524273c7d9bafa85077dc4ea7f6

SHA-3 (Keccak)

Es la última adición a la familia de funciones hash SHA. A diferencia de las anteriores versiones, SHA-3 funciona desde una lógica de hashing completamente distinta. Como resultado su nivel de seguridad es superior, así como ha sido optimizada para el hardware de computadoras modernas de hoy en día. Una de las principales ventajas es que su nivel de dificultad puede ser ajustada y de allí tenemos opciones como SHA3-224, SHA3-256, SHA3-384 y SHA3-512. De ellos la opción estándar es SHA3-256.

Sin embargo, hay que destacar que SHA-3 proviene de un grupo de sistemas de hashing más amplio conocido como Keccak. Tanto Keccak como SHA-3 usan el mismo principio de hashing, pero se diferencian en sus valores de codificación. Esto origina que al usar alguna de las opciones SHA-3 o Keccak, los hashes arrojados sean distintos.  Pese a estas diferencias la salida del hash es la misma y es de un total de 64 caracteres para la versión estándar de 256 bits.

Uno de los proyectos más emblemáticos que hace uso intensivo de SHA-3 (en su variante Keccak) es Ethereum. Esta criptomoneda creada por Vitalik Buterin usa Keccak-256 para su proceso de hashing y minería de criptomonedas.

Por ejemplo, un archivo de texto que tenga la siguiente cadena de texto "Hola mundo!" dará como resultado el siguiente hash SHA3-256:

29f12fce7c26ed8e1768b8a315ad012ae64ae444e570307e750ca01c4a9c94ad

Pero si usamos Keccak-256, obtendremos el siguiente resultado:

15885257b8e66fa2bf0d30cd1cd2c56c9136e196aee4545cdabd0895f58aab8a

RIPEMD

La función RIPEMD (RACE Integrity Primitives Evaluation Message Digest) es una función hash desarrollada en Europa por Hans Dobbertin, Antoon Bosselaers y Bart Preneel, y publicada en 1996. RIPEMD ofrece una funcionalidad y seguridad parecida a la de SHA-1, y aún hoy no se le descubre ninguna colisión o falla de seguridad. La salida del hash en RIPEMD-160 (el estándar más usado de esta función) es de 40 caracteres.

RIPEMD tiene como principal ventaja es que su extensión de bits ajustable (128, 160, 256 y 320 bits). Cada una de estas mejoras agrega un nivel mayor de seguridad sin que ello signifique una pérdida de potencia durante el cálculo de los hashes.

Siguiendo con nuestro ejemplo, un archivo de texto que tenga la siguiente cadena de texto "Hola mundo!" dará como resultado el siguiente hash RIPEMD-160:

2b51e67dae7467e0978b55d5c654cc6b8b4f235d

Scrypt

Scrypt es una función hash muy singular, a diferencia de SHA y RIPEMD que fueron creadas por gobiernos o instituciones criptográficas, Scrypt fue creada por una persona individual. El desarrollador Colin Percival conocido en la comunidad GNU/Linux y BSD, creó esta función para usarla en su sistema de respaldo en línea, Tarsnap.

Scrypt hace uso de clave generada por el usuario junto a un complejo sistema matemático impulsado por un pool de entropía para asegurar los datos.  El resultado de su trabajo es una de las funciones hash más seguras conocidas hasta el momento. De hecho, Scrypt es considerada como más segura que cualquiera de las versiones de SHA incluidas SHA-3 o Keccak. A pesar de su dificultad su coste computacional es relativamente bajo y ofrece una excelente seguridad contra ataques de fuerza bruta. La extensión de los hash scrypt es adaptable, el estándar es usar una salida de 64 caracteres pero puede ser ampliada incluso más allá de los 4096 caracteres.

BLAKE

Otra función hash singular es BLAKE. Esta función tiene su origen en la función criptográfica ChaCha de Dan Bernstein. BLAKE fue creada por Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn, Christian Winnerlein con el fin de competir contra SHA.  El resultado es una función hash tan segura como SHA-256 y SHA-3, pero muchísimo más rápida y con menos consumo de poder de cómputo.

En la actualidad existen dos implementaciones que son la función hash BLAKE2 y una nueva implementación conocida como BLAKE3, anunciada en enero de 2020.

Funciones hash en la tecnología blockchain

Uno de usos más importante en la actualidad de las funciones hash está en la tecnología blockchain. Desde la creación del Bitcoin en 2009 por Satoshi Nakamoto, los hash han jugado un papel importante en la tecnología blockchain.

Pero ¿Cuáles son los usos de los hashes en blockchain? Pues bien conozcamos algunos de estos usos a continuación:

Generación de direcciones de criptomonedas

Las direcciones de criptomonedas son quizás uno de los elementos en lo que más ponemos atención en nuestro primer contacto con las criptomonedas. Seguramente nos preguntamos ¿Cómo garantizan que estas direcciones son únicas dentro de un sistema descentralizado? Pues eso se lo debemos a las funciones hash.

Las direcciones de criptomonedas son creadas en su totalidad usando criptografía asimétrica y funciones hash. La generación de estas direcciones pasa primero por crear la clave privada de nuestro monedero. Esta clave nos permite controlar nuestras criptomonedas, pero también generar la clave pública. Esta clave pública la podemos entregar a cualquier para que nos envíen criptomonedas.

 Sin embargo, las claves públicas originadas por criptografía asimétrica son muy largas. Así que para reducir su tamaño usamos las funciones hash. De esa forma, obtenemos una cadena de texto más corta y fácil de manejar. Todo ello sin renunciar a la seguridad y la unicidad de cada una de ellas.

Minería de criptomonedas

El segundo punto de estas funciones hace su aparición es el proceso de minería. La minería hace referencia al proceso por el que se realiza un intenso trabajo de cálculo con el fin de generar un bloque. Este proceso intenso de cálculo es posible gracias al uso de las funciones hash.

Por ejemplo, en Bitcoin, la minería hace un uso intensivo de cálculo de hashes SHA-256. Cada vez que un nuevo bloque se genera en Bitcoin se necesita calcular un hash SHA-256 del mismo. Suena fácil, pero la verdad es que la dificultad de esta tarea en enorme. Es tan compleja que la red BItcoin realiza cerca de 100 trillones de cálculos por segundo durante 10 minutos para conseguir el hash correcto.

Con esto podemos comprender aún mejor la importancia del hash no solo en la informática en general sino también en el mundo blockchain. Después de todo, una sencilla cadena de texto es la que nos permite agregar una enorme capa de seguridad sobre una tecnología que mueve cientos de millones de dólares a lo largo del mundo.