Firma cieca: come proteggiamo il segreto del voto | METIS Italia Vai al contenuto

Sicurezza del voto

La firma cieca: il segreto del voto garantito dalla matematica

Un'elezione online deve tenere insieme tre cose che sembrano in contrasto: solo chi ne ha diritto vota, ciascuno una volta sola, e nessuno può sapere cosa ha votato. Con la firma cieca il sistema verifica il diritto al voto e accetta la scheda senza mai poterle collegare tra loro. In questa pagina spieghiamo come, prima in parole semplici e poi nel dettaglio tecnico.

L'idea in una busta

Immagina di mettere la tua scheda, già compilata, dentro una busta foderata di carta carbone e di presentarti al seggio.

Lo scrutatore controlla il tuo documento, verifica che tu sia nella lista e che non abbia già votato, poi firma sopra la busta chiusa. Grazie alla carta carbone la firma passa sulla scheda, ma lo scrutatore non l'ha mai vista.

Ti allontani, togli la busta e infili nell'urna la scheda firmata, insieme alle schede di tutti gli altri. Chi apre l'urna vede che la firma è autentica, quindi la scheda è valida, ma non può sapere quale busta l'aveva contenuta.

La firma cieca fa la stessa cosa con la matematica: la "busta" è un numero casuale che conosce solo il tuo browser.

Il voto passo per passo

  1. Apri il link personale

    Il link ricevuto per email vale una sola volta e solo per quella votazione. La pagina carica la chiave pubblica della votazione: ogni votazione ha la sua.

  2. Scegli e confermi

    Selezioni i candidati e confermi il riepilogo. Fino a questo momento nulla è stato inviato.

  3. Il browser prepara il gettone

    Il tuo browser genera un gettone casuale e lo "maschera" moltiplicandolo per un numero segreto che resta solo nel tuo dispositivo.

  4. Prima richiesta: la firma

    Il browser invia il gettone mascherato insieme al tuo link personale. Il server controlla che la votazione sia aperta e che tu non abbia già votato, segna "ha votato" con il solo giorno e firma il gettone mascherato. Non riceve le tue scelte e non vede il gettone.

  5. Il browser toglie la maschera

    Con il suo numero segreto il browser ottiene la firma valida sul gettone vero e la controlla da solo: se il server avesse firmato male, il voto si fermerebbe qui.

  6. Attesa casuale

    Il browser aspetta tra 5 e 20 secondi, scelti a caso, per separare nel tempo le due richieste.

  7. Seconda richiesta: la scheda

    Il browser invia gettone, firma e scelte con una richiesta anonima: niente link personale, niente cookie, niente sessione. Il server verifica la firma, controlla che il gettone non sia già stato usato e mette la scheda nell'urna.

  8. La ricevuta

    Ricevi un codice ricevuta, mostrato solo a te, e vedi le due righe appena salvate, rilette dal database: il registro con il tuo nome senza scelte, la scheda con le scelte senza nome.

Chi sa cosa

Ecco cosa vede il server in ciascuna delle due richieste. Nessuna delle due contiene insieme chi sei e cosa hai votato.

Prima richiesta (firma) Seconda richiesta (scheda)
Chi sei sì, dal link personale no
Il gettone no, solo mascherato sì
Le tue scelte no sì
Cookie e sessione sì no

Il valore mascherato e la firma della prima richiesta restano accanto al tuo nome solo per poter completare un voto interrotto: senza il numero segreto del tuo browser non portano in alcun modo al gettone né alla scheda.

Le garanzie

Un voto per elettore

Il server firma una sola volta per ogni link personale e ogni gettone firmato vale una sola scheda.

Nessuna scheda falsa

Una scheda senza firma valida, o con un gettone di un'altra votazione, viene rifiutata.

Collegamento impossibile

Il server non vede mai il gettone accanto al tuo nome: il segreto non dipende dalla promessa di non salvare qualcosa.

Integrità dei risultati

A votazione chiusa il sistema verifica che le schede siano tante quanti i gettoni usati, mai più dei votanti, e che i totali coincidano con l'urna.

Cosa puoi verificare da solo

  • Subito dopo il voto vedi le righe realmente salvate: sul tuo nome nessuna scelta, sulla scheda nessun nome.
  • Con il codice ricevuta controlli nella pagina dei risultati che la tua scheda sia stata contata. Di norma (segreto rafforzato) il codice conferma solo che la scheda c'è e non mostra le scelte: così nessuno può costringerti a dimostrare come hai votato. L'organizzatore può invece scegliere il voto verificabile: allora il codice mostra anche le tue scelte e va tenuto per sé.
  • A votazione chiusa, con almeno 5 schede, l'urna è pubblica senza nomi: puoi ricontare tutte le schede e confrontarle con la classifica.
  • Il codice del browser che maschera il gettone è pubblico e leggibile (js/AN05_blind.js): un esperto di fiducia può controllarlo.

Vedi anche: cosa salviamo, campo per campo →

Dettagli per esperti

  • Firma RSA a 2048 bit con chiave dedicata a ogni votazione, schema RSA-FDH: il gettone di 32 byte casuali viene esteso con MGF1-SHA256 alla lunghezza del modulo, insieme a un contesto che lo lega alla votazione.
  • Mascheramento nel browser con aritmetica BigInt: b = m · r^e mod n, con r casuale e primo con n; il browser toglie la maschera con r^-1 e verifica s^e mod n = m prima di inviare la scheda.
  • La chiave privata di ogni votazione è salvata cifrata (AES-256) con una frase segreta che non sta nel database: chi legge solo il database non può firmare gettoni.
  • Il server firma solo valori della lunghezza esatta del modulo e minori del modulo; i gettoni usati sono conservati come impronta SHA-256, senza data né riferimento all'elettore.
  • La richiesta della scheda è inviata senza credenziali (niente cookie, niente intestazione di provenienza) e l'endpoint non apre sessioni.
  • Ripresa: fino al deposito, gettone, maschera e firma restano solo nel browser dell'elettore; se la pagina si chiude, riaprendo il link dallo stesso dispositivo il voto si completa con la stessa ricevuta.

I limiti, detti chiaramente

Indirizzo internet
Non lo salviamo nelle nostre tabelle, ma i registri tecnici del fornitore di hosting lo conservano. Chi votasse dalla stessa rete da cui ha firmato lascerebbe due richieste dallo stesso indirizzo.
Vicinanza nel tempo
Firma e scheda arrivano a pochi secondi di distanza. L'attesa casuale la attenua, soprattutto quando votano molte persone nello stesso periodo.
Il tuo dispositivo
Se il computer o il telefono dell'elettore è compromesso da un programma malevolo, nessun sistema di voto online può proteggere ciò che accade su quel dispositivo.
La lista degli elettori
Chi può votare lo decide l'organizzatore: il numero di elettori e di votanti è pubblicato nei risultati, perché chiunque possa controllarlo.
Voti non completati
Se un elettore chiude la pagina dopo la firma e non la riapre più dallo stesso dispositivo, il suo diritto di voto risulta usato ma la scheda non arriva. I risultati lo segnalano come "voto non completato".

Domande frequenti sulla firma cieca

Devo fare qualcosa di speciale per votare?

No. Scegli, confermi e aspetti qualche secondo mentre la scheda viene depositata: tutto il resto lo fa il browser.

Cosa succede se chiudo la pagina prima della ricevuta?

Riapri il link personale dallo stesso dispositivo: il voto si completa da solo con la stessa ricevuta. Da un altro dispositivo non è possibile, perché il numero segreto è rimasto nel primo.

Il codice ricevuta rivela il mio voto?

Di norma no: nell'urna c'è solo la sua impronta e la verifica risponde soltanto "scheda presente e conteggiata". Solo se l'organizzatore ha scelto il voto verificabile (lo vedi scritto sulla scheda) il codice mostra le tue scelte a chi lo inserisce: in quel caso tienilo per te.

Tutte le votazioni usano la firma cieca?

Sì, tutte quelle create dopo la sua introduzione. Le votazioni precedenti restano con il sistema in uso quando sono state create, che separa comunque nome e scelte nei dati salvati.

Provala con la tua prossima votazione