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.
Contenido
¿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.
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.
¿Cómo debe ser un buen algoritmo de hash?
Pero hay algunas cualidades que hacen que un algoritmo de hashing sea más fuerte que otros. Y aquí hay algunos buenos ejemplos de propiedades que son deseables.
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.
¿Para qué sirve un hash?
El propósito general de un hash es el de verificar la integridad de una pieza de información. Debido a que el hash es único para un dato, entonces se puede utilizar como una huella dactilar única.
El uso principal que se le da es para verificar que la información no haya sido modificada en internet al utilizar una canal de comunicación inseguro. Es decir, que sirve para verificar la integridad.
Y es que si la misma no ha sido alterada en el camino, el hash que da como resultado la información que ha llegado debe ser el mismo que la información que ha sido enviada.
En el caso de la tecnología de blockchain, el hash es utilizado en varias partes del sistema.
Por ejemplo, cada cabecera del bloque tiene un hash del bloque anterior, lo que garantiza que se forme una cadena y que los bloques anteriores no han sido modificados.
También se utiliza el hash en la minería de Bitcoin debido a que este sirve para encontrar el bloque válido.
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:
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.
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:
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.
Puedes generar tus propios hashes en este sitio.
¿Cuáles son las funciones hash más utilizadas?
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.
¿Qué es SHA-256?
SHA-256 es un algoritmo que forma parte de la familia de SHA-2, donde SHA significa Secure Hash Algorithm (Algoritmo Hash Seguro).
Este fue publicado en 2001 como un esfuerzo en conjunto entre la NSA y NSIT para crear un sucesor a la familia SHA 1, que estaba perdiendo seguridad contra ataques de fuerza bruta.
El 256 que vemos en el nombre hace referencia al tamaño del hash final. Ya que sin importar el tamaño del texto de entrada, el resultado será siempre de 256 bits.
¿Qué es MD6?
El MD6 es una función de hash que significa Message-Digest Algorithm (Algoritmo de Resumen de Mensajes). La cual fue presentada en 2009 como un candidato para la familia SHA-3.
Este utiliza una estructura de arbol de Merkle que permite el cálculo en paralelo de entradas muy largas.
¿Cómo se relaciona el hash con la blockchain?
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 irá 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.
¿Qué es la tasa de hash?
La tasa de hash es la medida de cuantos hashes se pueden calcular por segundo. Que en ordenadores modernos pueden llegar a cifras de millones, billones, trillones o más.
En el caso de Bitcoin, esta es una medida de cuantos hashes por segundos se calculan en toda la red. Así como cuantos hashes pueden realizar los equipos de minería.
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.
Agrega un Comentario