Diccionario de Criptomonedas

¿Qué Es Una Función Hash? [Criptomonedas]

Qué Es Una Función Hash

Una función hash es una función matemática que transforma una entrada de cualquier tamaño en una salida encriptada de un tamaño fijo.

Sin importar la cantidad de información que tenga lo que ingresamos en la función hash, puede ser una cadena de palabras o un archivo, siempre nos devolverá un hash del mismo tamaño.

Lo importante de la función es que no se puede utilizar para obtener la entrada a partir de la salida, no existe la ingeniera inversa en este caso. Por eso es que se considera al hash como una función unidireccional, de un solo lado. Esto es similar a cuando encendemos una hoja de papel, no podemos recuperarla luego.

Por otro lado, siempre que utilicemos la misma información obtendremos el mismo resultado al pasarla por la función de hash, lo cual permite validar la información si conocemos el hash. Algo que es de suma importancia para conocer si no ha sido alterada.

Todas estas cosas son fundamentales para las criptomonedas, en especial para la tecnología blockchain.

¿Cómo funciona un hash criptográfico?

Lo típico es que con una función hash ingresemos información de longitud variable y obtengamos a cambio una salida con un tamaño fijo.

Ejemplo de entradas y salidas de SHA256

Pero cuando se trata de una función hash criptográfica, se combinan las capacidades de la hash y algunas propiedades de seguridad para pasar un mensaje.

Las funciones hash no solo son utilizadas para las cadenas de bloques, sino también en los sistemas informáticos donde se necesitan la comprobación de la integridad de los mensajes y la autenticación de la información.

En líneas generales, estas funciones hashes son consideradas medidas de seguridad débiles debido a que se trata de algoritmos de tiempo polinómico. Esto significa que el tiempo de ejecución está limitado por una expresión polinómica en el tamaño de la entrada.

Es un poco complejo el tema para este artículo, pero lo que debe quedarnos claro es que aun así, no son fácilmente descifrables.

Las funciones de hash criptográficas tienen algunas características extras de seguridad que los típicos hashes no tienen, algo que hace más difícil que alguien pueda determinar el mensaje o la información dentro.

Propiedades de un algoritmo de hash fuerte

Pero hay algunas cualidades que hacen que un algoritmo de hashing sea más fuerte que otros. Y aquí hay algunos buenos ejemplos de eso.

1. Determinismo

Un algoritmo hash debe ser determinístico, lo que significa que siempre debe entregar una salida del mismo tamaño independientemente de la longitud de la entrada.

Esto significa que si hasheamos una oración, el hash resultado debería ser de igual tamaño que si ingresamos en la entrada un libro entero.

2. Resistencia un ataque de preimagen

Una función hash fuerte debe ser resistente a un ataque de preimagen. Es decir, debe ser extremadamente difícil revertir el hash para recuperar el valor del mensaje original de entrada. Por tanto, la función hash debe ser de una sola dirección, o mejor dicho irreversible.

3. Resistencia a la colisión

Una colisión ocurre cuando dos objetos colisionan. Un concepto que también podemos encontrar en la criptografía y los hashes.

Se dice que existe una colisión cuando dos entradas diferentes arrojan el mismo resultado de salida.

Esto es algo muy malo para el algoritmo que utilicemos para generar los hashes, ya que estará roto y por tanto será inseguro.

Algo así implicaría que alguien podría crear información maliciosa que simule ser la verdadera para saltarse la seguridad, haciendo obsoleto así la función de hash.

Por tanto, un algoritmo seguro y de confianza debe ser asistente a este tipo de problemas.

4. Efecto avalancha

Esta propiedad implica que si hacemos un cambio, sin importar lo pequeño que sea, debe genera un cambio sustancial en la salida.

Por eso el nombre, ya que es como si creara un efecto de avalancha por más que hayamos cambiado un punto o una coma de la oración de entrada. Debe verse completamente diferente.

5. Velocidad Hash

En muchas situaciones, el algoritmo de hashing debe generar el hash de forma rápida.

Esto es lo que se considera una propiedad ideal de una función de hash de criptografía. Además, es una propiedad que se rige por la subjetividad.

Es decir, a veces queremos que la función haga los cálculos lo más rápido posible, mientras que en otras ocasiones necesitamos que se tome su tiempo para hacer las cosas más lentas. Todo depende de como lo vayamos a utilizar.

Por ejemplo, si tenemos una web y queremos que mostrar al visitante la información lo más rápido posible, entonces lo primero es lo deseable. Sin embargo, a la hora de una contraseña, queremos que al atacante le tome mucho trabajo.

Algoritmos de Hashing

Los algoritmos por lo general no debemos crearlos en caso de que necesitemos usar uno, muchas veces ya han sido ideados por otras personas y están listos para usar.

Existen muchos y los podemos agregar en diferentes familias, aquí van las más conocidas y algunos ejemplos:

  • Secure Hash Algorithm (SHA): en esta familia encontramos a SHA-1, SHA-2 (que dentro suyo están SHA-224, SHA-56, SHA-384 y SHA-512) y SHA-3 (SHA3-224, SHA3-256, SHA3-384 y SHA3-512). SHA-1 no se utiliza más, mientras que el más común de todos es SHA-256, que es el que utiliza Bitcoin.
  • Message Digest (MD): esta familia contiene una variedad de funciones de hash que incluyen MD2, MD4, MD5 y MD6. Anteriormente era considerado el algoritmo predilecto, pero eso, dejo de ser cierto cuando se encontró que ocasionaba colisiones.
  • Windows NTHash: también conocido como hash Unicode o NTLM, este hash es comúnmente utilizado por los sistemas Windows porque es más seguro que su predecesor, el hash LM. Sin embargo, NTHash también tiene vulnerabilidades de las que preocuparse, pero este algoritmo en particular es parte integral de los sistemas Windows.

Otros ejemplos son BLAKE 2 y BLAKE 3, RIPMD-160 y WHIRPOOL, entre otros.

Ejemplo de un Hash

Ahora que sabemos lo que es una función hash, es momento de salir de lo teórico y pasar al plano de lo práctico. Veamos algunos ejemplos.

Tomemos una frase de Harry Potter como entrada:

Las palabras son, en mí no tan humilde opinión, nuestra más inagotable fuente de magia, capaces de infligir daño y de remediarlo.

Albus Dumbledore

Si a esto lo pasamos por un algoritmo de hash SHA-256, el resultado será el siguiente:

dc18ec2991d457843657e792583e78e1af9023d92a8a7f29863d6c298ed3b17f

SHA-256

Pero que ocurre si queremos ingresar un mensaje mucho más pequeño como “Harry Potter”. Entonces la salida será de igual tamaño mientras usemos el mismo algoritmo.

f984f4bdcde0465676326e5d329aff6a84d1395c3d606827473764ff43b3feb6

SHA-256

Esto se debe a que ambas salidas son de 256 bits, que se son expresadas como una cadena de 64 caracteres en hexadecimal.

No importa que tan largo sea el mensaje, siempre conseguiremos la misma longitud de respuesta. Esto se debe a que el algoritmo es determinista, como vimos anteriormente.

Ahora si probáramos la misma cadena anterior, pero con una función de hash MD5, entonces acabaríamos con algo distinto:

1803c4bf3dc3c0493fc2f2bf8b0e5d8f

MD5

En este caso la salida es un poco más corta, y eso se debe a que MD5 nos ofrece una salida de 32 caracteres hexadecimales de largo.

También podríamos probarlo con algoritmo llamado SHA-512, que como imaginaras tiene el doble de largo que uno SHA-256.

796261d150c5902abfc38d4b9681b7a93351084cd2ddf2778ed71daf8fc0ddd6b5ecaacaeac5e07bb59b760f6e3e3abb7dc83bcba83485eb7e2a8ce41c8942ce

SHA-512

Puedes generar tus propios hashes en este sitio.

La función hash y las criptomonedas

Lo que permite que las criptomonedas funcionen es la cadena de bloques, que es una especie de libro contable distribuido que forma enlaces entre bloques para almacenar las transacciones.

La cadena de bloques solo contiene bloques con transacciones válidas, lo que previene las transacciones fraudulentas y lo que se conoce como problema de doble gasto.

Este enlazamiento entre bloques se consigue a partir de los hashes de los mismos. Una serie de números y letras que no se parecen en nada a la información con la que se generaron.

Cuando se crea un nuevo bloque, se añade también el hash del anterior, siendo parte de la entrada de la función hash para generar el hash del nuevo bloque. Así estamos seguros de que un bloque forma parte de la cadena, ya que cualquier cambio generaría un efecto en cascada por toda la blockchain.

Aquí es donde entra la minería, ya que es el trabajo que realizan los mineros para generar los nuevos bloques. No solo deben generar el hash del nuevo bloque, sino también que este tenga un valor determinado.

Cuando un minero quiere crear un bloque válido debe conseguir las transacciones que irán dentro y también una serie de información importante que ira dentro de la cabecera.

No se pasa por la función de hash todo el bloque, sino que solo la cabecera. Una que tiene como información el número de versión del bloque, el tiempo, el hash del bloque anterior, el hash de la raíz del árbol de Merkle, el nonce y el hash objetivo.

La idea es que el hash que genere se encuentre por debajo del hash objetivo. Pero sabemos que si ingresamos la misma información siempre obtendremos el mismo resultado.

Por eso existe el nonce o número utilizado una sola vez, que sirve solamente para ser cambiado y que la función arroje otro resultado.

Así debe comenzar a probar múltiples combinaciones hasta dar con una solución. Solo así el bloque será válido y podrá ser integrado en la cadena al mismo tiempo que recibe recompensas en formas de criptomonedas.

Un lugar donde puedes aprender más sobre esto es en el artículo de minería de Bitcoin.

Detalle a tener en cuenta

El minero debe hallar el nonce que genere el hash correcto, lo que requiere un método de prueba y error que consume mucho tiempo.

Es muy poco probable que un minero encuentre el nonce correcto en el primer intento, lo que significa que el minero tiene que probar un gran número de opciones de nonce antes acertar.

Cuanto mayor sea la dificultad, es probable que tarde más en generar la solución.

Preguntas frecuentes

Resumen

  • El hash es una función importante para las necesidades de encriptación que necesitan las criptomonedas.
  • La misma entrada siempre produce la misma salida.
  • La función hash es una parte muy importante de la tecnología de la cadena de bloques.
  • El hash en la blockchain es generado a partir de la información de la cabecera del bloque.

Criptotario

Me llamo Martin, soy ingeniero y apasionado de las inversiones y la tecnología. Me gusta mucho leer libros y todo aquello que me haga mejorar día a día.

Agrega un Comentario

Haz clic aquí para añadir un comentario