pass.gawor.eu / sekrety jednorazowe
— architektura —

Jak to działa.

① 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:

  1. liczy SHA-256(id) i blokuje wiersz tranzakcyjnie (SELECT … FOR UPDATE),
  2. weryfikuje TTL,
  3. derywuje klucz, wykonuje AES-GCM decrypt — tag GCM gwarantuje integralność,
  4. kasuje wiersz i commituje transakcję,
  5. 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

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