Hashcash

pexels-photo-160107
14 febrero 201729 mayo 2017

Los lectores del libro ya estarán familiarizados con términos tan importantes para el funcionamiento de la tecnología blockchain como hashing, criptografía simétrica o criptografía asimétrica. Elementos explicados en el capítulo 9 del libro (“Criptografía y consenso aplicado a la blockchain”), firmado por Jaime Núñez Miller, socio fundador de Bankabit y de Zentank y veterano de la comunidad Bitcoin. En el siguiente espacio, Jaime amplía nuestros conocimientos, ilustrándonos sobre el origen del término hashcash, su funcionamiento y cómo el creador de Bitcoin, Satoshi Nakamoto, logró integrar con éxito este concepto en su propuesta.

***

La propuesta de Satoshi hace uso de un sistema inventado en 1997 por el criptógrafo inglés Adam Back, llamado hashcash y que pretendía poner freno a los envíos de spam masivo. La idea era imponer un coste no monetario al envío de cada correo. A Back se le ocurrió que los correos podrían incorporar la prueba de que la computadora que lo enviaba había dedicado antes cierto tiempo y recursos para poder enviar ese correo. El coste en electricidad (tiempo de CPU) para enviar un correo podía ser de un céntimo. Quien enviase unos pocos correos al día no notaría nada, pero quien quisiera enviar millones de correos debería dedicar bastante más recursos a ello, imponiéndose de esta forma un coste.  

La forma de obligar al ordenador a consumir esos recursos consistía en plantear para cada correo que se quisiera enviar un problema complejo de resolver o “prueba de trabajo”. En el caso de hashcash consistía en hacer el hashing del mensaje una y otra vez (variando cada vez un pequeño dato llamado “Nonce”) hasta encontrar un hash que reuniera unas determinadas condiciones, en hashcash se pedía que empezara por cuatro ceros. Recordemos que es imposible predecir cuál será un hash por lo que la única forma de dar con uno concreto es mediante fuerza bruta.

Si queremos aumentar el coste de enviar un correo, basta con aumentar el tiempo que se tarda en encontrar ese hash (aumentar la dificultad) añadiendo más requisitos al hash, por ejemplo aumentando el número de ceros que debe tener. Para aumentar la dificultad podemos pedir que el objetivo sea que el hash empiece con seis ceros en vez de con cuatro.

El contenido utilizado para calcular el hash debía incorporar una serie de datos además del mensaje de correo en sí, y en especial un contador llamado “Número usado sólo una vez” (Number used Once  o “nonce” en inglés) que cambiaba cada vez que el ordenador calculaba un hash. El nonce es la forma de asegurar que el hash resultante es distinto en cada intento.

Si el hash calculado no comienza con esos ceros, el nonce cambia y se intenta de nuevo, así hasta que aleatoriamente (por fuerza bruta) el ordenador da con un hash que tenga ese número de ceros delante. Recordemos que es imposible saber de antemano cuál será el hash, por lo que habrá que hacer miles o millones de intentos antes de dar con el hash requerido.

Esquema del proceso hashcash para encontrar una prueba de trabajo (hash) con dificultad n

 

Ejemplo:

 

Mensaje Contador (Nonce) Contenido Hash del contenido
“Mi mensaje” 1 “Mi mensaje 1” 2e8de37a8849fb5309…
“Mi mensaje” 2 “Mi mensaje 2” 80e81dbf8a0e77c897…
“Mi mensaje” 3 “Mi mensaje 3” a0bbf40f1e545c4930…
“Mi mensaje” 4437 “Mi mensaje 4437” 00008687e1371c27cd…

 

 

Nonce En criptografía se llama nonce a un número arbitrario, aleatorio o secuencial que solamente se utiliza una única vez al realizar algún tipo de operación. El único objetivo del nonce en nuestro contexto es introducir un cambio en el contenido a hashear. De esta forma podemos hacer todos los intentos necesarios y cada vez obtendremos un hash distinto.

 

Dificultad Cuando se pide que el hash comience con una determinada cantidad de ceros, en realidad se requiere que sea “cualquier número inferior a otra cifra ya predeterminada”. A ese número predeterminado le llamamos target (objetivo). Por ejemplo, imaginemos una lotería en la que el bombo tuviera 99.999.999 bolas numeradas desde el cero. Si pusiéramos el target en 00009.999 querría decir que cualquier bola entre la cero y la 9.999 tendría premio y por tanto la primera bola que obtuviéramos con un número inferior a 9.999 sería la bola de la suerte, el número premiado. De esta forma cuanto menor sea el target, mayor será la dificultad y más bolas tendremos que sacar hasta dar con una bola premiada. En nuestro caso sería un hash “premiado”.

Añadir ese hash al mensaje de correo sería como ponerle un sello de correos; pero un sello que fabrica el propio ordenador dedicando recursos a ello. El hash sería aquí la prueba de que se ha realizado un trabajo; algo que demuestra que el remitente ha incurrido en un coste y que por tanto ya puede enviar ese correo. Enviar miles de correos ya no sería gratis. Por desgracia el sistema hashcash no se llegó a generalizar pero sí abrió la puerta a otras muchas ideas.