Hashing se refiere al proceso de generar una salida de tamaño fijo a partir de una entrada de tamaño variable. Esto se hace mediante el uso de fórmulas matemáticas conocidas como funciones hash (implementadas como algoritmos hash).
Aunque no todas las funciones hash implican el uso de criptografía, las llamadas funciones hash criptográficas son el núcleo de las criptomonedas. Gracias a ellos, las cadenas de bloques y otros sistemas distribuidos pueden alcanzar niveles significativos de integridad y seguridad de los datos.
Tanto las funciones hash convencionales como las criptográficas son deterministas. Ser determinista significa que mientras la entrada no cambie, el algoritmo hash siempre producirá la misma salida (también conocido como resumen o hash).
Normalmente, los algoritmos hash de las criptomonedas están diseñados como funciones unidireccionales, lo que significa que no pueden revertirse fácilmente sin grandes cantidades de tiempo y recursos informáticos. En otras palabras, es bastante fácil crear la salida a partir de la entrada, pero relativamente difícil ir en la dirección opuesta (generar la entrada sólo a partir de la salida). En términos generales, cuanto más difícil es encontrar la entrada, más seguro se considera el algoritmo hash.
¿Cómo funciona una función hash?
Diferentes funciones hash producirán resultados de diferentes tamaños, pero los posibles tamaños de salida para cada algoritmo hash son siempre constantes. Por ejemplo, el algoritmo SHA-256 sólo puede producir resultados de 256 bits, mientras que SHA-1 siempre generará un resumen de 160 bits.
Para ilustrar, ejecutemos las palabras "Binance" y "binance" a través del algoritmo hash SHA-256 (el que se usa en Bitcoin).
Tenga en cuenta que un cambio menor (la mayúscula de la primera letra) resultó en un valor hash totalmente diferente. Pero como utilizamos SHA-256, las salidas siempre tendrán un tamaño fijo de 256 bits (o 64 caracteres), independientemente del tamaño de entrada. Además, no importa cuántas veces ejecutemos las dos palabras a través del algoritmo, las dos salidas permanecerán constantes.
Por el contrario, si ejecutamos las mismas entradas a través del algoritmo hash SHA-1, obtendríamos los siguientes resultados:
En particular, el acrónimo SHA significa Algoritmos Hash Seguros. Se refiere a un conjunto de funciones hash criptográficas que incluyen los algoritmos SHA-0 y SHA-1 junto con los grupos SHA-2 y SHA-3. El SHA-256 forma parte del grupo SHA-2, junto con el SHA-512 y otras variantes. Actualmente, sólo los grupos SHA-2 y SHA-3 se consideran seguros.
¿Por qué importan?
Las funciones hash convencionales tienen una amplia gama de casos de uso, incluidas búsquedas en bases de datos, análisis de archivos grandes y gestión de datos. Por otro lado, las funciones hash criptográficas se utilizan ampliamente en aplicaciones de seguridad de la información, como la autenticación de mensajes y la toma de huellas digitales. Cuando se trata de Bitcoin, las funciones hash criptográficas son una parte esencial del proceso de minería y también desempeñan un papel en la generación de nuevas direcciones y claves.
El verdadero poder del hash surge cuando se trata de enormes cantidades de información. Por ejemplo, se puede ejecutar un archivo o conjunto de datos grande a través de una función hash y luego usar su salida para verificar rápidamente la precisión e integridad de los datos. Esto es posible debido a la naturaleza determinista de las funciones hash: la entrada siempre dará como resultado una salida simplificada y condensada (hash). Esta técnica elimina la necesidad de almacenar y "recordar" grandes cantidades de datos.
El hashing es particularmente útil en el contexto de la tecnología blockchain. La cadena de bloques de Bitcoin tiene varias operaciones que involucran hash, la mayoría de ellas dentro del proceso de minería. De hecho, casi todos los protocolos de criptomonedas se basan en hash para vincular y condensar grupos de transacciones en bloques, y también para producir vínculos criptográficos entre cada bloque, creando efectivamente una cadena de bloques.
Funciones hash criptográficas
Nuevamente, una función hash que implementa técnicas criptográficas puede definirse como una función hash criptográfica. En general, romper una función hash criptográfica requiere innumerables intentos de fuerza bruta. Para que una persona "revierta" una función hash criptográfica, tendría que adivinar cuál fue la entrada mediante prueba y error hasta que se produzca la salida correspondiente. Sin embargo, también existe la posibilidad de que diferentes entradas produzcan exactamente el mismo resultado, en cuyo caso se produce una “colisión”.
Técnicamente, una función hash criptográfica debe seguir tres propiedades para ser considerada efectivamente segura. Podemos describirlas como resistencia a la colisión, resistencia a la preimagen y resistencia a la segunda preimagen.
Antes de analizar cada propiedad, resumamos su lógica en tres frases cortas.
Resistencia a la colisión: no es factible encontrar dos entradas distintas que produzcan el mismo hash como salida.
Resistencia previa a la imagen: no es factible "revertir" la función hash (encontrar la entrada de una salida determinada).
Resistencia a la segunda preimagen: no es posible encontrar una segunda entrada que colisione con una entrada específica.
Resistencia a la colisión
Como se mencionó, una colisión ocurre cuando diferentes entradas producen exactamente el mismo hash. Por lo tanto, una función hash se considera resistente a colisiones hasta el momento en que alguien encuentra una colisión. Tenga en cuenta que siempre existirán colisiones para cualquier función hash porque las posibles entradas son infinitas, mientras que las posibles salidas son finitas.
Dicho de otra manera, una función hash es resistente a las colisiones cuando la posibilidad de encontrar una colisión es tan baja que requeriría millones de años de cálculos. Entonces, a pesar de que no existen funciones hash libres de colisiones, algunas de ellas son lo suficientemente fuertes como para considerarse resistentes (por ejemplo, SHA-256).
Entre los distintos algoritmos SHA, los grupos SHA-0 y SHA-1 ya no son seguros porque se han encontrado colisiones. Actualmente, los grupos SHA-2 y SHA-3 se consideran resistentes a colisiones.
Resistencia previa a la imagen
La propiedad de la resistencia a la preimagen está relacionada con el concepto de funciones unidireccionales. Una función hash se considera resistente a la preimagen cuando existe una probabilidad muy baja de que alguien encuentre la entrada que generó una salida particular.
Tenga en cuenta que esta propiedad es diferente de la anterior porque un atacante intentaría adivinar cuál fue la entrada al observar una salida determinada. Una colisión, por otro lado, ocurre cuando alguien encuentra dos entradas diferentes que generan la misma salida, pero no importa qué entradas se utilizaron.
La propiedad de resistencia a la preimagen es valiosa para proteger los datos porque un simple hash de un mensaje puede demostrar su autenticidad, sin necesidad de revelar la información. En la práctica, muchos proveedores de servicios y aplicaciones web almacenan y utilizan hashes generados a partir de contraseñas en lugar de contraseñas en texto sin formato.
Resistencia a la segunda preimagen
Para simplificar, podemos decir que la resistencia de la segunda preimagen está en algún punto intermedio entre las otras dos propiedades. Un ataque de segunda preimagen ocurre cuando alguien es capaz de encontrar una entrada específica que genera la misma salida de otra entrada que ya conoce.
En otras palabras, un ataque de segunda preimagen implica encontrar una colisión, pero en lugar de buscar dos entradas aleatorias que generen el mismo hash, buscan una entrada que genere el mismo hash generado por otra entrada específica.
Por tanto, cualquier función hash que sea resistente a colisiones también lo será a ataques de segunda preimagen, ya que estos últimos siempre implicarán una colisión. Sin embargo, todavía se puede realizar un ataque de preimagen a una función resistente a colisiones, ya que implica encontrar una única entrada a partir de una única salida.
Minería
Hay muchos pasos en la minería de Bitcoin que involucran funciones hash, como verificar saldos, vincular entradas y salidas de transacciones y hacer hash de transacciones dentro de un bloque para formar un árbol Merkle. Pero una de las principales razones por las que la cadena de bloques de Bitcoin es segura es el hecho de que los mineros necesitan realizar una gran cantidad de operaciones de hash para finalmente encontrar una solución válida para el siguiente bloque.
Específicamente, un minero tiene que probar varias entradas diferentes al crear un valor hash para su bloque candidato. En esencia, solo podrán validar su bloque si generan un hash de salida que comience con una cierta cantidad de ceros. La cantidad de ceros es lo que determina la dificultad de la minería y varía según la tasa de hash dedicada a la red.
En este caso, la tasa de hash representa cuánta potencia informática se invierte en la minería de Bitcoin. Si la tasa de hash de la red aumenta, el protocolo Bitcoin ajustará automáticamente la dificultad de extracción para que el tiempo promedio necesario para extraer un bloque se mantenga cercano a los 10 minutos. Por el contrario, si varios mineros deciden dejar de minar, lo que hace que la tasa de hash caiga significativamente, la dificultad de minado se ajustará, haciendo que sea más fácil minar (hasta que el tiempo promedio de bloque vuelva a 10 minutos).
Tenga en cuenta que los mineros no tienen que encontrar colisiones porque hay múltiples hashes que pueden generar como salida válida (comenzando con una cierta cantidad de ceros). Por lo tanto, hay varias soluciones posibles para un determinado bloque, y los mineros sólo tienen que encontrar una de ellas, según el umbral determinado por la dificultad de la minería.
Dado que la minería de Bitcoin es una tarea costosa, los mineros no tienen motivos para engañar al sistema, ya que provocaría pérdidas financieras importantes. Cuantos más mineros se unen a una cadena de bloques, más grande y más fuerte se vuelve.
Pensamientos finales
No hay duda de que las funciones hash son herramientas esenciales en informática, especialmente cuando se trata de grandes cantidades de datos. Cuando se combinan con la criptografía, los algoritmos hash pueden ser bastante versátiles y ofrecen seguridad y autenticación de muchas maneras diferentes. Como tal, las funciones hash criptográficas son vitales para casi todas las redes de criptomonedas, por lo que comprender sus propiedades y mecanismos de funcionamiento es sin duda útil para cualquier persona interesada en la tecnología blockchain.