Hashowanie IP — statystyki bez przechowywania danych osobowych
Hashowanie IP pozwala liczyć unikalne kliknięcia i kraje bez trzymania adresów w bazie. Zobacz, jak działa sól, rotacja i czego nie tracisz.
Gdzie leżą adresy IP ludzi, którzy kliknęli w twój link? Krótka odpowiedź: zależy. Albo nigdzie, bo nikt ich nie zapisał. Albo w bazie, w kolumnie pełnej cyferek, którą ktoś kiedyś będzie musiał komuś wytłumaczyć.
Otwierasz panel skracarki. Widzisz "1240 kliknięć z Polski, 380 z Niemiec". Ładnie. Tylko że żeby policzyć ten kraj, system musiał najpierw zobaczyć czyjś adres. Zobaczyć to jedno. Pytanie, czy go potem trzyma.
IP to dane osobowe. Serio.
Wiele osób przechodzi nad tym do porządku dziennego, a nie powinno. Pełny adres IP w świetle RODO jest daną osobową. Tak orzekł TSUE w sprawie Breyer (C-582/14): skoro istnieje legalna droga, żeby powiązać IP z konkretnym człowiekiem (choćby przez dostawcę internetu na wniosek sądu), to ten adres jest daną, którą prawo chroni.
I co z tego wynika? Jeśli twoja skracarka, analityka albo CDN trzyma kolumnę ip_address wypchaną adresami w stylu 83.21.144.7, to prowadzisz rejestr danych osobowych. Z całym bagażem: podstawa prawna, retencja, prawo do bycia zapomnianym, ryzyko wycieku. Cały ten cyrk.
A tobie tak naprawdę potrzebne są dwie liczby. Ile było unikalnych wejść. I mniej więcej skąd. Do tego pełny adres jest zbędny.
Jak działa hashowanie
Hashowanie IP to przepuszczenie adresu przez funkcję jednokierunkową (na przykład SHA-256). Wchodzi adres, wychodzi ciąg znaków, z którego nie da się odtworzyć oryginału:
sha256("83.21.144.7") → 9f86d081884c7d659a2feaa0...
Klucz jest w słowie "jednokierunkowa". Mając sam hash, nie cofniesz się do adresu. Możesz tylko sprawdzić, czy ten sam adres pojawił się jeszcze raz, bo identyczny input daje zawsze identyczny hash. I dokładnie tyle ci wystarczy, żeby liczyć unikalne wizyty.
Gdzie ludzie się wykładają
Sam hash to za mało. Tu jest haczyk.
Adresów IPv4 jest "tylko" jakieś 4 miliardy. Dla komputera to nie jest dużo. Atakujący w kilka godzin policzy hashe wszystkich możliwych adresów, zbuduje tablicę odwracającą (rainbow table) i twój "anonimowy" hash przestaje być anonimowy. Pyk, rozwiązane.
Dlatego porządne hashowanie ip ma dwa dodatki.
- Sól (salt): tajny ciąg dokładany do adresu przed hashowaniem, czyli
sha256(salt + ip). Nie znasz soli, nie zbudujesz tablicy. Koniec zabawy. - Rotacja soli: sól wymieniasz co jakiś czas, zwykle co dobę. Efekt? Ten sam użytkownik liczy się jako unikalny w ciągu jednego dnia, ale po północy jego hash się zmienia i nie da się go już połączyć z wczorajszym. To podejście rozpropagował Plausible i kilka podobnych narzędzi.
W pseudokodzie wygląda to mniej więcej tak:
salt = sekret_na_dzisiaj() # rotowany co 24h
visitor_id = sha256(salt + ip + user_agent)
# zapisujesz visitor_id, NIE zapisujesz ip
Co zostaje, a co znika
Zestawmy to na sucho.
Zostaje:
- liczba unikalnych odwiedzających (po hashu, nie po adresie),
- statystyki kraju i regionu (kraj odczytujesz z IP w locie i zapisujesz sam kraj, nie adres),
- rozróżnienie nowy kontra powracający w obrębie doby.
Znika:
- rejestr danych osobowych w bazie,
- konieczność pytania o zgodę na cookie, bo nie ma trwałego identyfikatora osoby,
- scenariusz, w którym wyciek bazy ujawnia, kto klikał w jaki link.
To nie jest handel "mniej danych za gorsze raporty". To po prostu wyrzucenie danych, których nigdy nie potrzebowałeś, żeby podjąć decyzję.
U mnie w cutty
Surowych adresów odwiedzających nie przechowuję. IP idzie przez hash, a sam adres nie trafia do bazy kliknięć. Dostajesz to, co realnie się przydaje: ile kliknięć, z jakich krajów, jak to się układa w czasie. Bez budowania profilu konkretnej osoby. Możesz skrócić pierwszy link na cutty.dev i podejrzeć panel, w którym nie ma ani jednego surowego adresu.
W praktyce wygląda to tak:
- chcesz sprawdzić, czy kampania ruszyła → masz wykres kliknięć,
- zastanawiasz się, czy dorobić wersję niemiecką → masz rozbicie na kraje,
- nie dowiesz się (i ja też nie), że "Jan Kowalski o 14:32 z domu kliknął w link". Bo tej informacji fizycznie nie ma.
Cała infra siedzi zresztą w UE, więc odpada przy okazji transfer danych za ocean.
Kiedy to wciąż za mało
Bądźmy uczciwi. Hashowanie z solą bardzo utrudnia identyfikację, ale nie jest magią. Przy bardzo małym, znanym zbiorze osób (powiedzmy link wysłany do trzech konkretnych klientów) teoretycznie da się zgadywać metodą eliminacji. Mało prawdopodobne, a jednak.
Jeśli pracujesz z naprawdę wrażliwym kontekstem, dołóż do hashowania inne warstwy. Agregację (pokazuj liczby dopiero od kilku wejść). Krótką retencję. Rezygnację z zapisu user-agenta. Hashowanie ip to fundament prywatnej analityki, nie cała ściana.
A teraz pytanie do ciebie: gdyby ktoś jutro włamał się do bazy twojej obecnej skracarki, ile by się o twoich czytelnikach dowiedział? Jeśli odpowiedź cię niepokoi, wiesz już, gdzie szukać.