① Tworzenie
Generujemy dwa losowe tokeny: id (18 bajtów) oraz url_key (32 bajty). Wyprowadzamy klucz szyfrujący przez HKDF-SHA256:
K = HKDF(
ikm = url_key,
salt = APP_PEPPER,
info = "ots:v1:data"
)
Szyfrujemy tekst AES-256-GCM(K, iv, plaintext) i zapisujemy w bazie tylko: SHA-256(id), ciphertext, iv, tag, expires_at oraz ewentualnie pw_salt + iterations.
② Link
Zwracamy URL w postaci:
https://example.com/s/<id>#<url_key>
Wszystko po znaku # — fragment — przeglądarki nie wysyłają w żądaniach HTTP. Klucz nigdy nie trafia na serwer i nie ma śladu w logach access-log.
③ Odczyt
Przy żądaniu POST /reveal JS przepisuje fragment z URL do ukrytego pola formularza. Serwer:
- liczy
SHA-256(id)i blokuje wiersz tranzakcyjnie (SELECT … FOR UPDATE), - weryfikuje TTL,
- derywuje klucz, wykonuje
AES-GCM decrypt— tag GCM gwarantuje integralność, - kasuje wiersz i commituje transakcję,
- zwraca plaintext (bez cache, bez logów).
Jeśli ktokolwiek dotrze do bazy danych przed odczytem — nie odszyfruje treści bez znajomości url_key oraz APP_PEPPER (plik konfiguracyjny serwera).
Czego nie zapisujemy
- plaintextu — nigdy
- klucza URL — nigdy
- adresu IP — tylko
SHA-256dla rate-limitu, oportunistyczne czyszczenie - user-agentów, referrerów, ciasteczek śledzących — nigdy
Granice modelu
To narzędzie nie chroni przed: zainfekowanym urządzeniem nadawcy/odbiorcy, kompromitacją serwera połączoną z kompromitacją kanału przekazania linku. Zawsze przekazuj hasło innym kanałem niż link.
wróć do tworzenia →