Firma ciega: así protegemos el secreto del voto | METIS Italia Ir al contenido

Seguridad del voto

La firma ciega: el secreto del voto garantizado por las matemáticas

Una votación en línea tiene que conciliar tres cosas que parecen chocar: solo vota quien tiene derecho, cada uno una sola vez, y nadie puede saber cómo ha votado nadie. Con la firma ciega el sistema comprueba el derecho a votar y acepta la papeleta sin poder relacionar nunca las dos cosas. Esta página explica cómo, primero con palabras sencillas y después con detalle técnico.

La idea en un sobre

Imagina que metes tu papeleta ya rellenada en un sobre forrado de papel de calco y la llevas al colegio electoral.

El responsable comprueba tu documento, verifica que estás en la lista y que aún no has votado, y firma por fuera del sobre cerrado. Gracias al papel de calco la firma pasa a la papeleta, pero el responsable nunca la ha visto.

Te apartas, quitas el sobre y echas la papeleta firmada en la urna, junto con las de todos los demás. Quien abre la urna ve que la firma es auténtica, así que la papeleta es válida, pero no puede saber de qué sobre salió.

La firma ciega hace lo mismo con las matemáticas: el "sobre" es un número aleatorio que solo conoce tu navegador.

El voto paso a paso

  1. Abre tu enlace personal

    El enlace recibido por correo funciona una sola vez y solo para esa votación. La página carga la clave pública de la votación: cada votación tiene la suya.

  2. Elige y confirma

    Seleccionas los candidatos y confirmas el resumen. Hasta aquí no se ha enviado nada.

  3. El navegador prepara el token

    Tu navegador genera un token aleatorio y lo "enmascara" multiplicándolo por un número secreto que solo se queda en tu dispositivo.

  4. Primera petición: la firma

    El navegador envía el token enmascarado junto con tu enlace personal. El servidor comprueba que la votación está abierta y que aún no has votado, marca "ha votado" solo con el día y firma el token enmascarado. No recibe tus elecciones y no ve el token.

  5. El navegador quita la máscara

    Con su número secreto el navegador obtiene la firma válida sobre el token real y la comprueba por sí mismo: si el servidor hubiera firmado mal, el voto se detendría aquí.

  6. Espera aleatoria

    El navegador espera entre 5 y 20 segundos, elegidos al azar, para separar en el tiempo las dos peticiones.

  7. Segunda petición: la papeleta

    El navegador envía token, firma y elecciones en una petición anónima: sin enlace personal, sin cookies, sin sesión. El servidor verifica la firma, comprueba que el token no se ha usado y mete la papeleta en la urna.

  8. Tu recibo

    Recibes un código de recibo que solo ves tú y ves los dos registros que se acaban de guardar, leídos de nuevo de la base de datos: el registro con tu nombre y sin elecciones, y la papeleta con elecciones y sin nombre.

Quién sabe qué

Esto es lo que ve el servidor en cada una de las dos peticiones. Ninguna contiene a la vez quién eres y cómo has votado.

Primera petición (firma) Segunda petición (papeleta)
Quién eres sí, por el enlace personal no
El token no, solo enmascarado sí
Tus elecciones no sí
Cookies y sesión sí no

El valor enmascarado y la firma de la primera petición se guardan junto a tu nombre solo para completar un voto interrumpido: sin el número secreto de tu navegador no llevan ni al token ni a la papeleta.

Las garantías

Un voto por votante

El servidor firma una sola vez por enlace personal y cada token firmado vale para una sola papeleta.

Ninguna papeleta falsa

Una papeleta sin firma válida, o con un token de otra votación, se rechaza.

Imposible relacionarlos

El servidor nunca ve el token junto a tu nombre: el secreto no depende de la promesa de no guardar algo.

Integridad del resultado

Al cerrar la votación el sistema comprueba que hay tantas papeletas como tokens usados, nunca más que votantes, y que los totales coinciden con la urna.

Lo que puedes comprobar tú mismo

  • Justo después de votar ves los registros que se han guardado de verdad: ninguna elección junto a tu nombre, ningún nombre en la papeleta.
  • Con el código de recibo compruebas en la página de resultados que tu papeleta se ha contado. Normalmente (secreto reforzado) el código solo confirma que la papeleta está y no muestra tus elecciones: así nadie puede obligarte a demostrar cómo has votado. El organizador puede elegir en cambio un voto verificable: entonces el código también muestra tus elecciones y debes guardarlo solo para ti.
  • Al cerrar la votación, con al menos 5 papeletas, la urna es pública y sin nombres: puedes volver a contar cada papeleta y compararlas con la clasificación.
  • El código del navegador que enmascara el token es público y legible (js/AN05_blind.js): un experto de confianza puede revisarlo.

Consulta también: qué guardamos, campo por campo →

Detalles para expertos

  • Firma RSA de 2048 bits con una clave propia de cada votación, esquema RSA-FDH: el token aleatorio de 32 bytes se expande con MGF1-SHA256 hasta la longitud del módulo, junto con un contexto que lo vincula a la votación.
  • Enmascaramiento en el navegador con aritmética BigInt: b = m · r^e mod n, con r aleatorio y coprimo con n; el navegador desenmascara con r^-1 y comprueba que s^e mod n = m antes de enviar la papeleta.
  • La clave privada de cada votación se guarda cifrada (AES-256) con una frase secreta que no está en la base de datos: quien solo lee la base de datos no puede firmar tokens.
  • El servidor solo firma valores de exactamente la longitud del módulo y menores que el módulo; los tokens usados se guardan como huella SHA-256, sin fecha y sin referencia al votante.
  • La petición de la papeleta se envía sin credenciales (sin cookies, sin cabecera referrer) y el endpoint no abre ninguna sesión.
  • Reanudación: hasta el envío, token, máscara y firma se quedan solo en el navegador del votante; si la página se cierra, al volver a abrir el enlace desde el mismo dispositivo el voto se completa con el mismo recibo.

Los límites, sin rodeos

Dirección de internet
No la guardamos en nuestras tablas, pero los registros técnicos del proveedor de alojamiento sí la conservan. Quien vote desde la misma red desde la que firmó dejará dos peticiones desde la misma dirección.
Cercanía en el tiempo
Firma y papeleta llegan con pocos segundos de diferencia. La espera aleatoria lo atenúa, sobre todo cuando muchas personas votan a la vez.
Tu dispositivo
Si el ordenador o el móvil del votante está infectado por software malicioso, ningún sistema de votación en línea puede proteger lo que ocurre en ese dispositivo.
La lista de votantes
Quién puede votar lo decide el organizador: el número de votantes y de personas que han votado se publica en los resultados, así que cualquiera puede comprobarlo.
Votos incompletos
Si un votante cierra la página después de la firma y no vuelve a abrirla desde el mismo dispositivo, su derecho a votar cuenta como usado pero la papeleta nunca llega. Los resultados lo indican como "voto incompleto".

Preguntas frecuentes sobre la firma ciega

¿Tengo que hacer algo especial para votar?

No. Eliges, confirmas y esperas unos segundos mientras se envía la papeleta: el navegador hace todo lo demás.

¿Y si cierro la página antes del recibo?

Vuelve a abrir tu enlace personal desde el mismo dispositivo: el voto se completa solo, con el mismo recibo. No se puede hacer desde otro dispositivo, porque el número secreto se quedó en el primero.

¿El código de recibo revela mi voto?

Normalmente no: la urna solo guarda su huella y la comprobación solo responde "papeleta presente y contada". Solo si el organizador ha elegido un voto verificable (lo pone en la papeleta) el código muestra tus elecciones a quien lo introduzca: en ese caso guárdalo solo para ti.

¿Todas las votaciones usan la firma ciega?

Sí, todas las creadas después de su introducción. Las votaciones anteriores mantienen el sistema vigente cuando se crearon, que en cualquier caso separa nombres y elecciones en los datos guardados.

Pruébalo en tu próxima votación