Hashcash es un sistema de prueba de trabajo que se utiliza para limitar el spam de correo electrónico y los ataques de denegación de servicio . Hashcash fue propuesto en 1997 por Adam Back [1] y descrito de forma más formal en el artículo de 2002 de Back "Hashcash – A Denial of Service Counter-Measure" [2] . En Hashcash, el cliente tiene que concatenar un número aleatorio con una cadena varias veces y hacer un hash de esta nueva cadena. Luego tiene que hacerlo una y otra vez hasta que se encuentre un hash que comience con una cierta cantidad de ceros. [3]
La idea de "... exigir a un usuario que calcule una función moderadamente difícil, pero no intratable..." fue propuesta por Cynthia Dwork y Moni Naor en su artículo de 1992 "Fijación de precios mediante el procesamiento o la lucha contra el correo basura". [4]
Hashcash es un algoritmo criptográfico de prueba de trabajo basado en hash que requiere una cantidad seleccionable de trabajo para calcularse, pero la prueba se puede verificar de manera eficiente. Para usos de correo electrónico, se agrega una codificación textual de un sello de hashcash al encabezado de un correo electrónico para demostrar que el remitente ha gastado una cantidad modesta de tiempo de CPU calculando el sello antes de enviar el correo electrónico. En otras palabras, como el remitente ha tardado una cierta cantidad de tiempo en generar el sello y enviar el correo electrónico, es poco probable que sea un spammer. El receptor puede, con un costo computacional insignificante, verificar que el sello es válido. Sin embargo, la única forma conocida de encontrar un encabezado con las propiedades necesarias es la fuerza bruta , probando valores aleatorios hasta que se encuentre la respuesta; aunque probar una cadena individual es fácil, las respuestas satisfactorias son lo suficientemente raras como para que se requiera una cantidad sustancial de intentos para encontrar la respuesta.
La hipótesis es que los spammers, cuyo modelo de negocio se basa en su capacidad de enviar grandes cantidades de correos electrónicos con un coste muy bajo por mensaje, dejarán de ser rentables si existe un pequeño coste por cada correo basura que envían. Los receptores pueden verificar si un remitente ha realizado tal inversión y utilizar los resultados para ayudar a filtrar el correo electrónico.
La línea de encabezado se parece a esto: [5]
X-Hashcash: 1:20:1303030600:[email protected]::McMybZIhxKXu57jd:ckvi
El encabezado contiene:
YYMMDD[hhmm[ss]]
.El encabezado contiene la dirección de correo electrónico del destinatario, la fecha del mensaje e información que demuestra que se ha realizado el cálculo requerido. La presencia de la dirección de correo electrónico del destinatario requiere que se calcule un encabezado diferente para cada destinatario. La fecha permite al destinatario registrar los encabezados recibidos recientemente y garantizar que el encabezado sea exclusivo del mensaje de correo electrónico.
El remitente prepara un encabezado y añade un valor de contador inicializado a un número aleatorio. Luego calcula el hash SHA-1 de 160 bits del encabezado. Si los primeros 20 bits (es decir, los 5 dígitos hexadecimales más significativos) del hash son todos ceros, entonces este es un encabezado aceptable. Si no, entonces el remitente incrementa el contador e intenta el hash nuevamente. De 2 160 valores hash posibles, hay 2 140 valores hash que satisfacen este criterio. Por lo tanto, la probabilidad de seleccionar aleatoriamente un encabezado que tendrá 20 ceros como el comienzo del hash es 1 en 2 20 (aproximadamente 10 6 , o aproximadamente uno en un millón). La cantidad de veces que el remitente necesita intentar obtener un valor hash válido está modelada por la distribución geométrica . Por lo tanto, el remitente en promedio tendrá que probar 2 20 valores para encontrar un encabezado válido. Si se calculan razonablemente los tiempos necesarios para calcular el hash, se tardaría aproximadamente un segundo en encontrarlo. No se conoce ningún método más eficiente que este enfoque de fuerza bruta para encontrar un encabezado válido.
Un usuario normal de una PC de escritorio no se vería afectado significativamente por el tiempo de procesamiento necesario para generar la cadena Hashcash. Sin embargo, los spammers sufrirían significativamente debido a la gran cantidad de mensajes spam que envían.
Técnicamente el sistema se implementa con los siguientes pasos:
"1:20:060408:[email protected]::1QTjaYd7niiQA/sc:ePa"
"060408"
, que representa la fecha 8 de abril de 2006). Si no se encuentra dentro de los dos días siguientes a la fecha actual, no es válida. (El intervalo de dos días compensa el desfase horario y el tiempo de enrutamiento de la red entre diferentes sistemas).Si la cadena hash pasa todas estas pruebas, se considera válida. Todas estas pruebas requieren mucho menos tiempo y espacio en disco que recibir el contenido del cuerpo del correo electrónico.
El tiempo necesario para calcular una colisión de hash de este tipo es exponencial con la cantidad de bits cero. Por lo tanto, se pueden agregar bits cero adicionales (duplicando la cantidad de tiempo necesario para calcular un hash con cada bit cero adicional) hasta que sea demasiado costoso para los spammers generar líneas de encabezado válidas.
Confirmar que el encabezado es válido es mucho más rápido y siempre toma la misma cantidad de tiempo, sin importar cuántos bits cero se requieran para un encabezado válido, ya que esto requiere solo una única operación de hash.
El sistema Hashcash tiene la ventaja, frente a las propuestas de micropagos que se aplican a los correos electrónicos legítimos, de que no se utiliza dinero real. Ni el remitente ni el destinatario tienen que pagar, por lo que se evitan por completo los problemas administrativos que conlleva cualquier sistema de micropagos y los problemas morales relacionados con el cobro por correo electrónico.
Por otra parte, como Hashcash requiere que se gasten recursos computacionales potencialmente significativos en cada correo electrónico que se envía, es algo difícil determinar la cantidad ideal de tiempo promedio que se desea que los clientes empleen para calcular un encabezado válido. Esto puede significar sacrificar la accesibilidad desde sistemas integrados de gama baja o correr el riesgo de que los hosts hostiles no se vean desafiados lo suficiente como para proporcionar un filtro efectivo contra el correo no deseado.
Hashcash también es bastante sencillo de implementar en agentes de usuario de correo y filtros de spam. No se necesita un servidor central. Hashcash se puede implementar de forma incremental: el encabezado Hashcash adicional se ignora cuando lo reciben clientes de correo que no lo entienden.
Un análisis plausible [6] concluyó que sólo uno de los siguientes casos es probable: o bien el correo electrónico que no es spam se queda bloqueado debido a la falta de capacidad de procesamiento del remitente, o bien el correo electrónico spam está destinado a pasar de todos modos. Ejemplos de cada uno de ellos incluyen, respectivamente, una topología de correo electrónico centralizada (como una lista de correo ), en la que un servidor debe enviar una enorme cantidad de correos electrónicos legítimos , y botnets o granjas de clústeres con los que los spammers pueden aumentar enormemente su capacidad de procesamiento.
La mayoría de estos problemas pueden solucionarse. Por ejemplo, las botnets pueden expirar más rápido porque los usuarios notan la alta carga de CPU y toman contramedidas, y los servidores de listas de correo pueden registrarse en listas blancas en los hosts de los suscriptores y, por lo tanto, quedar aliviados de los problemas de hashcash.
Otro problema que se prevé es que las computadoras se vuelven cada vez más rápidas según la ley de Moore , por lo que la dificultad de los cálculos necesarios debe aumentar con el tiempo. Sin embargo, es de esperar que los países en desarrollo utilicen hardware más antiguo, lo que significa que les resultará cada vez más difícil participar en el sistema de correo electrónico. Esto también se aplica a las personas de bajos ingresos en los países desarrollados que no pueden permitirse el hardware más moderno.
Al igual que Hashcash, las criptomonedas utilizan una función hash como sistema de prueba de trabajo. El auge de las criptomonedas ha creado una demanda de máquinas de minería basadas en ASIC . Aunque la mayoría de las criptomonedas utilizan la función hash SHA-256 , la misma tecnología ASIC podría utilizarse para crear solucionadores de Hashcash que sean tres órdenes de magnitud más rápidos que una CPU de consumo, lo que reduce la dificultad computacional para los spammers.
A diferencia del hashcash en las aplicaciones de correo, que depende de que los destinatarios establezcan manualmente una cantidad de trabajo destinada a disuadir a los remitentes maliciosos, la red de criptomonedas Bitcoin emplea un desafío de prueba de trabajo basado en hash diferente para permitir la minería competitiva de Bitcoin . Un minero de Bitcoin ejecuta un programa informático que recopila transacciones no confirmadas de los usuarios de la red. Juntos, estos pueden formar un "bloque" y generar un pago para el minero, pero la red solo acepta un bloque si su hash cumple con el objetivo de dificultad de la red. Por lo tanto, como en el hashcash, los mineros deben descubrir por fuerza bruta el "nonce" que, cuando se incluye en el bloque, da como resultado un hash aceptable.
A diferencia de Hashcash, el objetivo de dificultad de Bitcoin no especifica un número mínimo de ceros a la izquierda en el hash. En cambio, el hash se interpreta como un entero (muy grande), y este entero debe ser menor que el entero objetivo. Esto es necesario porque la red de Bitcoin debe ajustar periódicamente su nivel de dificultad para mantener un tiempo promedio de 10 minutos entre bloques sucesivos. Si solo se consideraran los ceros a la izquierda, entonces la dificultad solo podría duplicarse o reducirse a la mitad, lo que provocaría que el ajuste se sobrepasara o se quedara muy corto en respuesta a pequeños cambios en el tiempo promedio de bloque. Aun así, el número de ceros a la izquierda en el objetivo sirve como una buena aproximación de la dificultad actual. En enero de 2020, el bloque n.° 614525 tenía 74 ceros a la izquierda.
Hashcash se utilizó como una posible solución para los falsos positivos con sistemas de filtrado de spam automatizados, ya que los usuarios legítimos rara vez se verán afectados por el tiempo adicional que lleva extraer un sello. [7] SpamAssassin pudo verificar los sellos de Hashcash desde la versión 2.70 hasta la versión 3.4.2, asignando una puntuación negativa (es decir, menos probabilidades de ser spam) para los sellos de Hashcash válidos y no gastados. Sin embargo, aunque el complemento de Hashcash está activado de forma predeterminada, aún debe configurarse con una lista de patrones de direcciones que deben coincidir con el campo de recursos de Hashcash antes de que se pueda usar. [8] El soporte se eliminó del tronco de SpamAssassin el 26 de junio de 2019, lo que afectó a la versión 3.4.3 y posteriores. [9]
El proyecto de software Penny Post [10] en SourceForge implementa Hashcash en el cliente de correo electrónico Mozilla Thunderbird . [11] El proyecto recibe su nombre debido a la disponibilidad histórica de servicios de correo convencionales que le cuestan al remitente solo un centavo; consulte Penny Post para obtener información sobre dichos servicios de correo en la historia.
Microsoft también diseñó e implementó una especificación abierta ahora obsoleta [12] llamada "Email Postmark". Es similar a Hashcash. [13] Esto era parte de la Iniciativa de Reducción Coordinada de Spam (CSRI) de Microsoft. [14] La variante de Microsoft Email Postmark de Hashcash se implementa en los componentes de infraestructura de correo de Microsoft Exchange, Outlook y Hotmail. Las diferencias de formato entre Hashcash y el Email Postmark de Microsoft son que el Postmark convierte en hash el cuerpo además del destinatario, utiliza un SHA-1 modificado como función hash y utiliza múltiples sub-rompecabezas para reducir la variabilidad de la prueba de trabajo.
Al igual que el correo electrónico, los blogs suelen ser víctimas del spam en los comentarios . Algunos propietarios de blogs han utilizado scripts de hashcash escritos en lenguaje JavaScript para ralentizar a los spammers en los comentarios. [15] Algunos scripts (como wp-hashcash) afirman implementar hashcash, pero en su lugar dependen de la ofuscación de JavaScript para obligar al cliente a generar una clave coincidente; si bien esto requiere cierta potencia de procesamiento, no utiliza el algoritmo hashcash ni los sellos hashcash.
En un mercado digital, los proveedores de servicios pueden usar hashcash para generar reputación y atraer clientes. Para generar reputación, un proveedor de servicios primero selecciona una clave pública como su ID y luego descubre por fuerza bruta un nonce que, cuando se concatena con el ID, da como resultado un resumen de hash con varios ceros a la izquierda. Cuantos más ceros, mayor es la reputación. [16]
Hashcash no está patentado y la implementación de referencia [17] y la mayoría de las demás implementaciones son software libre. Hashcash está incluido o disponible para muchas distribuciones de Linux .
RSA ha hecho declaraciones de IPR al IETF sobre los acertijos de cliente [18] en el contexto de una RFC [19] que describía los acertijos de cliente (no hashcash). La RFC incluía hashcash en el título y hacía referencia a hashcash, pero el mecanismo que se describe en ella es un desafío interactivo de solución conocida que es más parecido a los acertijos de cliente; hashcash no es interactivo y, por lo tanto, no tiene una solución conocida. En cualquier caso, la declaración de IPR de RSA no se puede aplicar a hashcash porque hashcash es anterior [1] (marzo de 1997) a la publicación de los acertijos de cliente [20] (febrero de 1999) y a la presentación de la patente de los acertijos de cliente US7197639 [21] (febrero de 2000).