Napisanie na stronie „nie zapisujemy twojego hasła” kosztuje dokładnie tyle samo, co napisanie czegokolwiek innego: nic. To zdanie, nie gwarancja. Tak samo napisze je ten, kto mówi prawdę, jak ten, kto nie — a z twojej strony ekranu wyglądają identycznie.
To właśnie jest sedno problemu każdej strony, która prosi o hasło, żeby je „przeanalizować”. Nawet jeśli usługa jest nienaganna — czysty kod, dobre intencje, uczciwi ludzie — ty nie masz jak się o tym przekonać. Serwer to zamknięte pudełko. Wysyłasz mu najwrażliwszą rzecz, jaką masz, i ufasz, że po drugiej stronie dzieje się to, co ci obiecano.
I jest jeszcze szczegół, który zwykle umyka: obietnica niezapisywania nie chroni też przed tym, co nie zależy od obiecującego. Uczciwy serwer może mieć logi, których nikt nie przejrzał, pośredniczące proxy, automatyczną kopię zapasową, nowego pracownika albo po prostu gorszy dzień. Hasło już wyszło z twojego komputera. To, co stanie się dalej, jest poza twoim zasięgiem — a często i poza ich.
Jedyna odpowiedź, która nie wymaga wiary w nic
Rozwiązaniem nie jest lepsze obiecywanie. Jest nim niepotrzebowanie tych danych.
Jeśli twoje hasło nigdy nie opuszcza przeglądarki, pytanie „co oni z nim robią?” przestaje mieć sens. Nie ma żadnych „onych”. Nie ma serwera, który je odbiera, ani logów, w których się pojawia, ani kopii zapasowej, która je zawiera, ani pracownika, który mógłby je przeczytać. Zaufaniem nie zarządza się lepiej: usuwa się je z równania.
Właśnie to robi password.es. Sprawdzanie analizuje to, co wpisujesz, w twojej własnej przeglądarce, na twoim własnym procesorze. Tekst, który wystukujesz na klawiaturze, nigdzie nie podróżuje, bo nie ma dokąd.
Skąd bierze się losowość
Generator działa na tej samej zasadzie. Żeby zrobić losowe hasło, potrzeba losowości, a zdobyć ją można na dwa sposoby: poprosić o nią serwer albo poprosić przeglądarkę. Proszenie serwera byłoby absurdem: serwer znałby hasło wcześniej niż ty.
Więc prosimy przeglądarkę, przez crypto.getRandomValues(). To standardowe API
platformy webowej do losowości kryptograficznej — to, które istnieje dokładnie po
to, w odróżnieniu od Math.random(), które nadaje się do tasowania kart w grze,
a nie do czegokolwiek, co ma się oprzeć komuś zainteresowanemu. Losowość
produkuje sama przeglądarka, na twoim sprzęcie. My w tym nie uczestniczymy:
wynik pojawia się na twoim ekranie i tam zostaje.
Jak to sprawdzić, nie wierząc mi na słowo
Wszystko powyższe jest na razie akapitem napisanym przez tych samych ludzi, którzy zrobili tę stronę. Czyli: dokładnie tym, wobec czego kazałem ci być nieufnym. Więc mi nie wierz. Zobacz.
Otwórz narzędzia deweloperskie przeglądarki — F12 albo Cmd+Option+I na Macu
— przejdź na zakładkę Sieć (Network), zostaw ją otwartą i wejdź do
sprawdzania. Zobaczysz, jak ładuje się strona. Teraz wyczyść listę, kliknij w
pole hasła i pisz.
Oto co zobaczysz — i tu wypada być precyzyjnym, a nie sprzedawcą:
- Po kliknięciu w pole leci jedno żądanie. To nie twoje hasło — jeszcze nic
nie wpisałeś — tylko biblioteka, która wykonuje analizę: plik (w wersji
hiszpańskiej nazywa się
zxcvbn-es-es.min.js) niosący w środku listy słów, imion, wzorców klawiaturowych i znanych haseł, z którymi porównywany jest wpis. Pobiera się z password.es w chwili, gdy dotkniesz pola, żeby zdążył dojechać, zanim skończysz pisać. Wychodzi z tej samej domeny, jest plikiem statycznym i jest taki sam dla każdego, kto otworzy tę stronę — serwis ma po jednej wersji na język i każda strona ładuje swoją. - Od tego momentu, cokolwiek napiszesz, lista stoi w miejscu. Jedna litera, dwadzieścia, skasuj, zacznij od nowa, wklej długi tekst. Zero żądań. Licznik się nie rusza. Słownik jest już w twojej przeglądarce, a wyszukiwanie odbywa się w pamięci twojego komputera.
Cała różnica leży w tym rozróżnieniu. Nie chodzi o to, żebyś ufał, że żądanie nie niesie twojego hasła: chodzi o to, że żądania nie ma. Nie trzeba niczego interpretować ani rozumieć kodu; wystarczy patrzeć na licznik, który nie rośnie.
Pełny inwentarz, razem z wadami
Skoro argumentem jest „sprawdź sam”, dziwnie byłoby ukrywać to, co przy sprawdzaniu byś znalazł. Uczciwy inwentarz password.es:
Nie ma analityki. Ani Google Analytics, ani dyskretnej alternatywy, ani piksela. Był jeden i został usunięty ze wszystkich stron. Nie ma ciasteczek. Serwis nie zapisuje żadnego. Jedna rzecz jest jednak zapisana w twojej przeglądarce: to, czy wolisz motyw jasny czy ciemny — w pamięci lokalnej twojego własnego urządzenia. Nigdy nigdzie nie jest wysyłana i możesz ją skasować z tego samego inspektora. Nie ma rejestracji, kont ani formularzy: nie ma gdzie zostawić danych, nawet gdybyś chciał.
I wada, bo jest: strona przy ładowaniu prosi serwery Google o dwa kroje pisma. To znaczy, że Google widzi, iż ktoś z twoim IP załadował stronę z tej domeny — jak na przeogromnej liczbie innych serwisów. Nie widzi tego, co piszesz — tamto żądanie dzieje się wcześniej i już się nie powtarza — ale jest to żądanie do strony trzeciej, zobaczysz je w tej samej zakładce Sieć i nie miałoby żadnego sensu mówić ci, żebyś otworzył inspektora, a jednocześnie o tym nie wspomnieć. Jest na liście rzeczy do naprawienia.
Dlaczego o tym mówimy
Moglibyśmy napisać „zero żądań, pełna prywatność” i spać spokojnie. Brzmiałoby lepiej i byłoby fałszywe w szczegółach: jest jedno żądanie po słownik i są kroje pisma. Argument, który sypie się, gdy ktoś go sprawdzi, nie był argumentem: był reklamą.
Wersja precyzyjna jest mniej okrągła i wytrzymuje kontrolę: to, co piszesz, nie wychodzi z twojej przeglądarki, i widać to w trzydzieści sekund narzędziem, które już masz zainstalowane.
I uwaga, bo to wraca do ciebie jako reguła ogólna. Następnym razem, gdy jakaś strona poprosi cię o hasło, obojętnie po co, otwórz tę zakładkę i zobacz, czy po naciśnięciu klawisza pojawia się żądanie. Jeśli się pojawia, twoje hasło pojechało. Nieważne, co mówi informacja o prywatności, jak ładna jest kłódeczka przy formularzu ani jak poważnie wygląda firma. A jeśli strona pokazuje ci już przeanalizowane hasło po obrocie kółeczka, to już wiesz, którędy ono przeszło.
Zasada, o której w bezpieczeństwie mówi się najmniej, nie dotyczy haseł: dotyczy weryfikacji. Ufać jest dobrze. Sprawdzić jest lepiej, a tutaj to nic nie kosztuje.
Źródła: architektura samego password.es, weryfikowalna inspektorem dowolnej
przeglądarki — sprawdzanie pobiera z własnej domeny, przy zaznaczeniu pola,
bibliotekę analizy wraz z jej listami (zxcvbn-es-es.min.js) i nie wysyła
żadnego żądania w trakcie pisania ·
crypto.getRandomValues(), standardowe API z Web Crypto API do losowości
kryptograficznej · kod serwisu nie zawiera analityki, pikseli ani ciasteczek;
jedyną daną przechowywaną lokalnie jest preferencja motywu · kroje pisma są
serwowane z Google Fonts.