Anonimowe tokeny

Czym są anonimowe tokeny?

Jeśli korzystasz z klucza qwant.us, otrzymasz losowo wygenerowane hasło, które Twoja przeglądarka wysyła do nas przy każdym zapytaniu wyszukiwania, abyśmy mogli włączyć wyszukiwanie bez reklam. Jeśli korzystasz z naszej aplikacji na Androida lub naszego rozszerzenia internetowego dla Chrome i Firefox, zamiast hasła przeglądarka wysyła nam losowo wygenerowane hasło (anonimowy token) przy każdym żądaniu wyszukiwania w celu uwierzytelnienia, które jest generowane lokalnie. Gwarantuje to, że każde hasło jest unikalne i nie ma związku z rzeczywistym kluczem qwant.us ani między poszczególnymi hasłami.

Jaki problem mają rozwiązać anonimowe tokeny?

Gdyby przeglądarka zawsze wysyłała nam to samo hasło przy każdym zapytaniu, przynajmniej teoretycznie mielibyśmy możliwość ustalenia korelacji między wszystkimi wyszukiwaniami wykonanymi przy użyciu tego samego klucza. Nawet jeśli tego nie zrobimy, zaufanie nadal będzie konieczne, aby mieć pewność anonimowego wyszukiwania. Abyśmy nie tylko musieli obiecać anonimowe wyszukiwanie, ale także mogli je udowodnić, wprowadziliśmy anonimowe tokeny.

Jak to działa?

Chcemy więc, aby jednorazowe hasła były generowane bezpośrednio z urządzenia końcowego, a następnie wysyłane do nas w celu uwierzytelnienia podczas wyszukiwania. Jednak dla każdego anonimowego tokena na urządzeniu końcowym musimy upewnić się, że zwykły token został odjęty od klucza qwant.us dla niego, bez (i to jest sedno) informowania nas, który klucz qwant.us został użyty do wygenerowania anonimowego tokena.

Tradycyjnie użylibyśmy w tym celu jakiejś formy podpisu kryptograficznego. W takim przypadku podpisujemy wygenerowany anonimowy token. Następnie, gdy wyślesz nam anonimowy token wraz z podpisem w późniejszym czasie, możemy być pewni, że anonimowy token jest ważny. Jednak aby uzyskać podpis, musiałbyś wysłać nam anonimowy token wraz z prawdziwym kluczem, co unieważniłoby anonimowość.

Dlatego zamiast tego używamy zmodyfikowanej formy podpisu kryptograficznego, tak zwanego podpisu ślepego . Aby stworzyć rzeczywistą analogię, to tak, jakby wysłać nam swój anonimowy token w kopercie z kalki. W tym przykładzie nie bylibyśmy w stanie otworzyć koperty, ale bylibyśmy w stanie podpisać się z zewnątrz, więc nasz podpis zostałby przeniesiony na anonimowy token znajdujący się w środku. Kiedy otrzymasz kopertę z powrotem, możesz ją usunąć i odesłać nam hasło i podpis później. Moglibyśmy wtedy potwierdzić, że to rzeczywiście nasz podpis.

W rzeczywistości ta analogia jest nieco myląca, ponieważ w rzeczywistym procesie, w momencie wysłania nam anonimowego tokena i podpisu, nie tylko nigdy wcześniej nie widzieliśmy anonimowego tokena, ale także nigdy nie widzieliśmy samego podpisu. A jednak możemy zweryfikować, że podpis został wygenerowany przez nas.

Co to oznacza dla uwierzytelnionych wyszukiwań?

Korzystając z opisanego algorytmu, zarówno my, jak i użytkownik możemy zapewnić, że nowe losowe hasło niezwiązane z kluczem qwant.us jest używane za każdym razem do uwierzytelnionych wyszukiwań.

Szczególną cechą tego algorytmu jest to, że wszystkie komponenty zapewniające anonimowość są wykonywane lokalnie na urządzeniu użytkownika. Wykonany kod źródłowy może być przeglądany i weryfikowany przez każdego w dowolnym momencie.

Co najlepsze, nie trzeba niczego konfigurować, aby korzystać z anonimowych tokenów. Wystarczy zainstalować/używać naszego rozszerzenia do przeglądarki/aplikacji na Androida, aby urządzenie używało anonimowych tokenów do wszystkich wyszukiwań.

Algorytm, który za tym stoi:

W klasycznym podpisie RSA, wzięlibyśmy anonimowy token m, tajny wykładnik d oraz publiczny moduł N naszego klucza prywatnego i utworzylibyśmy podpis używając m^d (mod N). Chcemy jednak, aby m pozostało tajne.

Dlatego terminal tworzy liczbę losową r przy użyciu generatora liczb losowych, która jest niezwiązana z dzielnikiem N. Zatem największy wspólny dzielnik r i N musi wynosić 1.

Ponieważ r jest liczbą losową, wynika z tego, że m' nie ujawnia żadnych informacji o lokalnie przechowywanym anonimowym tokenie m.

Nasz serwer otrzymuje teraz zaciemniony anonimowy token m' z urządzenia końcowego wraz z kluczem qwant.us, który ma zostać użyty. Odejmujemy token od klucza i wysyłamy również zaciemniony podpis s'≡ (m')^d (mod N) z powrotem do urządzenia końcowego.

Terminal może teraz obliczyć rzeczywisty prawidłowy podpis RSA s dla niezaszyfrowanego anonimowego tokena: s≡ s' r^-1 (mod N). Działa to, ponieważ dla kluczy RSA, r^(e*d)≡ r (mod N). A zatem również: s ≡ s' * r^-1 ≡ (m')^d*r^-1 ≡ m^d*r^(e*d)*r^-1 ≡ m^d*r*r^-1 ≡ m^d (mod N).

Urządzenie końcowe użytkownika wysyła nam teraz niezaszyfrowany anonimowy token wraz z powiązanym podpisem w celu autoryzacji podczas wyszukiwania. Sam klucz nie jest już wysyłany do nas podczas wyszukiwania.

Pytania? Chętnie pomożemy!