En esta lección vamos a hablar de hashing. Ciertamente no es fácil, pero no dejaremos que eso nos disuada. Allá vamos.
✔️ El hashing consiste en convertir un conjunto de datos en un código, el hash, mediante un cálculo predeterminado.
✔️ El hashing se utiliza a menudo para proteger contraseñas de modo que sólo el usuario pueda leerlas y para comparar sumas de comprobación al descargar archivos.
✔️ Las firmas digitales utilizan el hashing para la autenticación, en la que el destinatario necesita la clave privada para descifrar el mensaje.
✔️ Las criptomonedas utilizan el hashing para la minería, en la que los ordenadores deben utilizar su potencia de cálculo para resolver enigmas y recibir recompensas.
El hashing es el proceso por el cual un conjunto de datos es convertido por una función en un código, el hash. ¿Cómo dice?
Pues expliquemos primero qué es un hash. Un hash es el resultado de algún tipo de cálculo basado en condiciones predefinidas. Un hash consiste en una serie de números y letras.
Daremos un ejemplo de hash, para hacerlo un poco más visual. Con SHA (Secure Hashing Algorithm) 256, se puede obtener un hash para cualquier tipo de información textual. Voy a crear dos frases que son muy parecidas, pero cuyo resultado (el hash) es muy diferente.
La frase "qué es el hashing" (la entrada) produce el siguiente hash:
a85eaf708bd0da1c0b7206ab8d69c30403b34be19588b71702d420ff9b21f09c (de output)
La frase "What is hashing" produce un hash muy diferente:
4bc6139ce79a8c6aeca74cd9397259fb54d4ea4fc7b930bb74404cfe94c34bcd
SHA-256 produce un hash de 256 bits de longitud (64 caracteres).
Por cierto, los hashes funcionan en una sola dirección. Puedes crear el hash de una frase, pero no puedes reconstruir una frase a partir del hash.
Un hash debe configurarse de forma que requiera un esfuerzo inaceptable adivinar el hash basándose en la fuerza bruta (simplemente comprobando todas las posibilidades 1 a 1). Cuantos más caracteres genere una función hash, más difícil será descifrar una entrada.
A estas alturas, la idea del hashing ya debe haber tomado forma en tu imaginación.
Qué bonito, menudo tarro de hashing. Pero, ¿qué se puede hacer realmente con él?
En general, podemos decir que el hashing se utiliza para asegurar los datos. En informática se utiliza sobre todo para proteger contraseñas.
Supongamos que te inventas una contraseña y tienes que enviarla por Internet introduciéndola en algún sitio. Si se envía en texto plano, sin cifrado ni hash, los hackers pueden leer lo que introduzcas ahí. Por eso hoy en día las contraseñas se cifran con hash, para que sólo el usuario pueda leer lo que introduce.
El hash también puede utilizarse para descargar archivos. Primero se calcula el hash del archivo antes de descargarlo y luego se comprueba si la llamada suma de comprobación es la misma. Si ambos valores coinciden, el archivo es el original. Muy práctico si no quieres que virus o troyanos pasen por los puertos.
Un fenómeno muy conocido en el mundo de la criptografía es la firma digital. En este caso, hay un emisor y un receptor. Se hace un hash de un mensaje. Sin la clave privada, el mensaje no puede leerse. El receptor del mensaje necesita la clave secreta para descifrarlo. Si el hash del mensaje coincide con el hash que puede calcularse con esta clave, entonces el mensaje es el mismo que el mensaje original.
En las criptomonedas, funcionan con la clave privada y la pública para mostrar tu dirección (pública) o determinar si puedes gastar tal cantidad de dinero (clave privada).
También se utiliza para los datos personales. Cuando pides cosas por internet en una tienda, primero creas una cuenta. La mayor parte de sus datos están cifrados, por lo que puede hacer el pedido de forma anónima, pero la entrega puede hacerse en su dirección.
El hashing puede protegerse aún más mediante las técnicas denominadas sal y pimienta. Con la sal, se puede añadir al hash un número generado aleatoriamente, tras lo cual se crea un nuevo hash, lo que dificulta aún más a los piratas informáticos descifrar el código.
Con la pimienta, se añade la misma secuencia de 32 caracteres aleatorios a todos los registros, eliminando prácticamente un ataque de fuerza bruta.
Cuando se mina Bitcoin, la gente suele hablar del hashrate. Puede que ahora seas capaz de adivinar qué significa esto.
El hashrate de un ordenador es la potencia de cálculo que posee para resolver un difícil puzzle criptográfico. Este difícil rompecabezas consiste en adivinar la entrada de un hash. Quien lo adivina primero añade un nuevo bloque a la cadena de bloques y obtiene la recompensa en forma de comisiones por transacción y nuevos Bitcoins.
El hashrate de la red Bitcoin es la potencia de cálculo total de todos los ordenadores que minan Bitcoin. A medida que aumenta, el puzzle se hace más difícil. El hecho es que, según Satoshi Nakamoto, hay que encontrar un nuevo bloque cada 10 minutos aproximadamente. Si la potencia de cálculo disminuye, por ejemplo si muchos mineros abandonan, el rompecabezas debe ser más fácil, de lo contrario esos diez minutos pronto se convierten en 11 o 12 minutos y se estropea el trabajo.
Cuando se crea un nuevo bloque en Bitcoin, tiene una serie de secciones. Cada bloque contiene un hash del bloque anterior. Esto es para asegurar que todos los bloques se almacenan secuencialmente.
A continuación, se encuentra la tx_root, que es el valor hash raíz del árbol Merkle que contiene todas las transacciones. Un árbol de Merkle puede considerarse como una colección de hashes. Es un diagrama de árbol, donde todas las transacciones reciben un hash y se fusionan hasta que sólo queda un registro con todas las transacciones (hashes) en un único hash, la raíz Merkle o también llamada hash raíz. Con este método, un bloque está mucho menos poblado que si hubiera que escribir todas las transacciones en él, y esto mejora la velocidad.
A continuación viene la marca de tiempo. Contiene la hora a la que se creó el bloque. De esta forma, sólo se pueden crear bloques hacia adelante en el tiempo.
A continuación viene el nonce. Se trata de un hash que el minero debe adivinar para poder minar un nuevo bloque.
En criptomoneda, se utiliza el hashing porque funciona muy bien y rápido. El hashing también contribuye significativamente a la seguridad porque es un sistema unidireccional. Es muy fácil generar un hash, pero adivinar la entrada a partir del hash es casi imposible.