Gettoni anonimi
Cosa sono i token anonimi?
Se si utilizza una chiave qwant.us, si riceve una password generata in modo casuale che il browser invia a noi con ogni query di ricerca in modo da poter abilitare la ricerca senza pubblicità. Se si utilizza la nostra app per Android, o la nostra estensione web per Chrome e Firefox, invece della password, il browser ci invia una password generata casualmente (token anonimo) con ogni richiesta di ricerca per l'autenticazione, che viene generata localmente. In questo modo si garantisce che ogni password sia unica e non abbia alcun legame con la chiave qwant.us vera e propria, né tra le singole password.
Quale problema dovrebbero risolvere i token anonimi?
Se il vostro browser ci inviasse sempre la stessa password ad ogni ricerca, avremmo almeno teoricamente la possibilità di stabilire una correlazione tra tutte le ricerche effettuate con la stessa chiave. Anche se non lo facessimo, ovviamente, la fiducia sarebbe comunque necessaria per avere la certezza di una ricerca anonima. Per non dover solo promettere la ricerca anonima, ma poterla anche dimostrare, abbiamo introdotto i token anonimi.
Come funziona?
Vogliamo quindi che le password una tantum siano generate direttamente dal vostro dispositivo endpoint, che poi ci invierete per l'autenticazione durante le vostre ricerche. Tuttavia, per ogni token anonimo sul vostro dispositivo finale, dobbiamo assicurarci che un token regolare sia stato sottratto dalla vostra chiave qwant.us, senza (e questo è il punto cruciale) dirci quale chiave qwant.us è stata usata per generare il token anonimo.
Tradizionalmente, a questo scopo si utilizza una forma di firma crittografica. In questo caso, firmeremmo il token anonimo generato. In questo modo, quando l'utente ci invia il token anonimo insieme alla firma in un secondo momento, possiamo essere sicuri che il token anonimo sia valido. Tuttavia, per ottenere la firma, avreste dovuto inviarci il token anonimo insieme alla vostra chiave reale, il che avrebbe annullato l'anonimato.
Pertanto, utilizziamo una forma modificata di firma crittografica, la cosiddetta firma cieca . Per creare un'analogia con la vita reale, è come inviarci il vostro token anonimo in una busta di carta carbone. In questo esempio, non saremmo in grado di aprire la busta, ma potremmo firmare dall'esterno, in modo da trasferire la nostra firma al token anonimo all'interno. Quando si riceve la busta, è possibile rimuoverla e inviarci la password e la firma in un secondo momento. Potremmo così confermare che si tratta effettivamente della nostra firma.
In realtà, questa analogia è un po' fuorviante, perché nel processo reale, nel momento in cui ci inviate il token anonimo e la firma, non solo non abbiamo mai visto il token anonimo prima, ma nemmeno la firma stessa. Eppure possiamo verificare che la firma è stata generata da noi.
Cosa significa questo per le ricerche autenticate?
Utilizzando l'algoritmo descritto, sia noi che voi possiamo garantire che per le vostre ricerche autenticate venga utilizzata ogni volta una nuova password casuale non correlata alla vostra chiave qwant.us.
La particolarità di questo algoritmo è che tutti i componenti che garantiscono l'anonimato vengono eseguiti localmente sul dispositivo. Il codice sorgente eseguito può essere visualizzato e verificato da chiunque in qualsiasi momento.
La cosa migliore è che non è necessario configurare nulla per utilizzare i token anonimi. È sufficiente installare/utilizzare la nostra estensione per il browser/applicazione per Android per far sì che il vostro dispositivo utilizzi i token anonimi per tutte le ricerche.
L'algoritmo alla base:
In una firma RSA classica, prenderemmo il token anonimo m
, l'esponente segreto d
, e il modulo pubblico N
della nostra chiave privata e creeremmo la firma usando m^d (mod N)
. Tuttavia, vogliamo che m
rimanga segreto.
Pertanto, il terminale crea un numero casuale r
utilizzando un generatore di numeri casuali, che non è correlato al divisore N
. Quindi il massimo comune divisore di r
e N
deve essere 1
.
Poiché r
è un numero casuale, ne consegue che m'
non rivela alcuna informazione sul token anonimo memorizzato localmente m
.
Il nostro server riceve ora il token anonimo offuscato m'
dal dispositivo finale insieme alla chiave qwant.us da utilizzare. Sottraiamo un token dalla chiave e inviamo la firma, anch'essa offuscata, s'≡ (m')^d (mod N)
al dispositivo finale.
Il terminale può ora calcolare la firma RSA valida s
per il token anonimo non criptato: s≡ s' r^-1 (mod N)
. Questo funziona perché per le chiavi RSA, r^(e*d)≡ r (mod N)
. E quindi anche: s ≡ s' * r^-1 ≡ (m')^d*r^-1 ≡ m^d*r^(e*d)*r^-1 ≡ m^d*r*r^-1 ≡ m^d (mod N)
.
Il vostro dispositivo finale ci invia ora il token anonimo non criptato insieme alla firma associata per l'autorizzazione durante una ricerca. La chiave stessa non ci viene più inviata durante la ricerca.