Anonieme tokens
Wat zijn anonieme tokens?
Als je een MetaGer-sleutel gebruikt, ontvang je een willekeurig gegenereerd wachtwoord dat je browser bij elke zoekopdracht naar ons stuurt zodat we advertentievrij zoeken kunnen inschakelen. Als je onze Android app, of onze webextensie voor Chrome en Firefox, gebruikt in plaats van het wachtwoord, stuurt je browser ons een willekeurig gegenereerd wachtwoord (anoniem token) bij elke zoekopdracht voor verificatie, dat lokaal wordt gegenereerd. Dit zorgt ervoor dat elk wachtwoord uniek is en geen verband houdt met de werkelijke MetaGer-sleutel, noch tussen de individuele wachtwoorden.
Welk probleem moeten anonieme tokens oplossen?
Als je browser ons altijd hetzelfde wachtwoord stuurt bij elke zoekopdracht, zouden we in theorie tenminste de mogelijkheid hebben om een correlatie vast te stellen tussen alle zoekopdrachten die met dezelfde sleutel zijn uitgevoerd. Zelfs als we dat niet doen, is vertrouwen natuurlijk nog steeds nodig om zeker te zijn van je anonieme zoekopdracht. Zodat we niet alleen de anonieme zoekopdracht hoeven te beloven, maar deze ook kunnen bewijzen, hebben we de anonieme tokens geïntroduceerd.
Hoe werkt het?
Dus we willen eenmalige wachtwoorden die direct vanaf uw eindpuntapparaat worden gegenereerd, die u vervolgens naar ons stuurt voor verificatie tijdens uw zoekopdrachten. Voor elk anoniem token op uw eindapparaat moeten we er echter voor zorgen dat er een regulier token is afgetrokken van uw MetaGer-sleutel, zonder (en dit is de crux) ons te vertellen welke MetaGer-sleutel is gebruikt om het anonieme token te genereren.
Traditioneel zouden we hiervoor een vorm van cryptografische handtekening gebruiken. In dit geval ondertekenen we het gegenereerde anonieme token. Wanneer je ons dan op een later tijdstip het anonieme token samen met de handtekening stuurt, kunnen we er zeker van zijn dat het anonieme token geldig is. Om de handtekening te krijgen, zou je ons echter het anonieme token samen met je echte sleutel hebben gestuurd, wat de anonimiteit teniet zou doen.
Daarom gebruiken we in plaats daarvan een aangepaste vorm van cryptografische handtekening, de zogenaamde blinde handtekening. Om een levensechte analogie te maken, is het alsof je ons je anonieme token in een carbonpapieren envelop stuurt. In dit voorbeeld zouden we niet in staat zijn om de envelop te openen, maar we zouden wel in staat zijn om te tekenen vanaf de buitenkant, zodat onze handtekening zou worden overgedragen aan het anonieme token binnenin. Als je de envelop terugkrijgt, kun je deze verwijderen en ons later het wachtwoord en de handtekening terugsturen. We kunnen dan bevestigen dat het inderdaad onze handtekening is.
In feite is deze analogie een beetje misleidend, want in het werkelijke proces, op het moment dat je ons het anonieme token en de handtekening stuurt, hebben we niet alleen nog nooit het anonieme token gezien, maar ook nog nooit de handtekening zelf. En toch kunnen we verifiëren dat de handtekening door ons is gegenereerd.
Wat betekent dit voor je geauthenticeerde zoekopdrachten?
Door het beschreven algoritme te gebruiken, kunnen zowel wij als jij ervoor zorgen dat een nieuw willekeurig wachtwoord dat niet gerelateerd is aan je MetaGer-sleutel elke keer wordt gebruikt voor je geauthenticeerde zoekopdrachten.
Het bijzondere aan dit algoritme is dat alle onderdelen die voor anonimiteit zorgen, lokaal op je apparaat worden uitgevoerd. Deze uitgevoerde broncode kan op elk moment door iedereen worden bekeken en geverifieerd.
Het beste van alles is dat je niets hoeft te configureren om anonieme tokens te gebruiken. Je hoeft alleen maar onze browserextensie/Android app te installeren/gebruiken om je apparaat anonieme tokens te laten gebruiken voor alle zoekopdrachten.
Het algoritme erachter:
In een klassieke RSA-handtekening zouden we het anonieme token m
, de geheime exponent d
, en de publieke modulus N
van onze privésleutel nemen en de handtekening maken met m^d (mod N)
. We willen echter dat m
geheim blijft.
Daarom maakt je terminal een willekeurig getal r
met een willekeurige getallengenerator, dat divisor-ongerelateerd is aan N
. Dus de grootste gemene deler van r
en N
moet 1
zijn.
Omdat r
een willekeurig getal is, volgt hieruit dat m'
geen informatie prijsgeeft over de lokaal opgeslagen anonieme token m
.
Onze server ontvangt nu het gecodeerde anonieme token m'
van je eindapparaat samen met de te gebruiken MetaGer-sleutel. We trekken een token af van de sleutel en sturen de eveneens gecodeerde handtekening s'≡ (m')^d (mod N)
terug naar je eindapparaat.
Je terminal kan nu de werkelijke geldige RSA-handtekening s
voor het onversleutelde anonieme token berekenen: s≡ s' r^-1 (mod N)
. Dit werkt omdat voor RSA-sleutels, r^(e*d)≡ r (mod N)
. En daarom ook: s ≡ s' * r^-1 ≡ (m')^d*r^-1 ≡ m^d*r^(e*d)*r^-1 ≡ m^d*r*r^-1 ≡ m^d (mod N)
.
Je eindapparaat stuurt ons nu het onversleutelde anonieme token samen met de bijbehorende handtekening voor autorisatie tijdens een zoekopdracht. De sleutel zelf wordt tijdens het zoeken niet meer naar ons verzonden.