Anonyma tokens
Vad är anonyma tokens?
Om du använder en qwant.us-nyckel får du ett slumpmässigt genererat lösenord som din webbläsare skickar till oss med varje sökfråga så att vi kan aktivera annonsfri sökning. Om du använder vår Android-app, eller vårt webbtillägg för Chrome och Firefox, istället för lösenordet, skickar din webbläsare ett slumpmässigt genererat lösenord (anonym token) till oss med varje sökbegäran för autentisering, som genereras lokalt. Detta säkerställer att varje lösenord är unikt och inte har någon koppling till den faktiska qwant.us-nyckeln eller mellan de enskilda lösenorden.
Vilket problem är anonyma tokens tänkta att lösa?
Om din webbläsare alltid skickar samma lösenord till oss vid varje sökning, skulle vi åtminstone teoretiskt ha möjlighet att fastställa ett samband mellan alla sökningar som utförs med samma nyckel. Även om vi inte gör det, skulle förtroende naturligtvis fortfarande vara nödvändigt för att vara säker på din anonyma sökning. För att vi inte bara ska behöva lova den anonyma sökningen, utan också kunna bevisa den, har vi infört de anonyma tokens.
Hur fungerar den?
Så vi vill ha engångslösenord som genereras direkt från din endpoint-enhet, som du sedan skickar till oss för autentisering under dina sökningar. För varje anonym token på din slutenhet måste vi dock se till att en vanlig token har subtraherats från din qwant.us-nyckel för den, utan att (och detta är kruxet) berätta för oss vilken qwant.us-nyckel som användes för att generera den anonyma token.
Traditionellt skulle vi använda någon form av kryptografisk signatur för detta ändamål. I det här fallet skulle vi signera den genererade anonyma token. När du sedan skickar oss den anonyma token tillsammans med signaturen vid ett senare tillfälle kan vi vara säkra på att den anonyma token är giltig. För att få signaturen skulle du dock ha skickat oss den anonyma token tillsammans med din riktiga nyckel, vilket skulle upphäva anonymiteten.
Därför använder vi istället en modifierad form av kryptografisk signatur, den så kallade blinda signaturen. För att skapa en verklighetstrogen analogi är det som att skicka oss din anonyma token i ett kuvert av karbonpapper. I det här exemplet skulle vi inte kunna öppna kuvertet, men vi skulle kunna skriva under från utsidan, så att vår signatur skulle överföras till den anonyma token inuti. När du får tillbaka kuvertet kan du ta bort det och skicka tillbaka lösenordet och underskriften senare. Vi kan då bekräfta att det verkligen är vår signatur.
I själva verket är denna analogi lite missvisande, eftersom vi i den faktiska processen, i det ögonblick du skickar oss den anonyma token och signaturen, inte bara aldrig har sett den anonyma token tidigare, utan heller aldrig har sett själva signaturen. Ändå kan vi verifiera att signaturen har genererats av oss.
Vad innebär detta för dina autentiserade sökningar?
Genom att använda den beskrivna algoritmen kan vi och du se till att ett nytt slumpmässigt lösenord som inte är relaterat till din qwant.us-nyckel används varje gång för dina autentiserade sökningar.
Det speciella med denna algoritm är att alla komponenter som säkerställer anonymitet exekveras lokalt på din enhet. Den exekverade källkoden kan visas och verifieras av vem som helst när som helst.
Det bästa av allt är att du inte behöver konfigurera något för att använda anonyma tokens. Det räcker med att installera/använda vårt webbläsartillägg/Android-app för att din enhet ska använda anonyma tokens för alla sökningar.
Den bakomliggande algoritmen:
I en klassisk RSA-signatur skulle vi ta den anonyma token m
, den hemliga exponenten d
och den offentliga modulen N
för vår privata nyckel och skapa signaturen med m^d (mod N)
. Vi vill dock att m
ska förbli hemlig.
Därför skapar terminalen ett slumptal r
med hjälp av en slumptalsgenerator, som inte är divisorrelaterat till N
. Därför måste den största gemensamma divisorn för r
och N
vara 1
.
Eftersom r
är ett slumptal följer att m'
inte avslöjar någon information om den lokalt lagrade anonyma token m
.
Vår server tar nu emot den obfuskerade anonyma token m'
från din slutenhet tillsammans med den qwant.us-nyckel som ska användas. Vi subtraherar en token från nyckeln och skickar den också obfuskerade signaturen s'≡ (m')^d (mod N)
tillbaka till din slutenhet.
Din terminal kan nu beräkna den faktiska giltiga RSA-signaturen s
för den okrypterade anonyma token: s≡ s' r^-1 (mod N)
. Detta fungerar eftersom för RSA-nycklar r^(e*d)≡ r (mod N)
. Och därför också: s ≡ s' * r^-1 ≡ (m')^d*r^-1 ≡ m^d*r^(e*d)*r^-1 ≡ m^d*r*r^-1 ≡ m^d (mod N)
.
Din slutenhet skickar nu den okrypterade anonyma token tillsammans med den tillhörande signaturen till oss för auktorisering under en sökning. Själva nyckeln skickas inte längre till oss under sökningen.