Przejdź do treści
← Wszystkie wpisy

Jak tapeshelf szyfruje filmy i dlaczego nie przechowuje kluczy

Prywatny film w tapeshelf jest dla właściciela i osób, które on sam wybrał. Oto jak aplikacja tego pilnuje i gdzie kończy się ta ochrona.

Od przesłania do odtwarzania

Twoja przeglądarka wysyła plik prosto do prywatnego zasobnika (bucketu) w magazynie zgodnym z S3, w częściach po 16 MB, które wznawiają się, gdy połączenie się zerwie. Plik nigdy nie przechodzi przez nasze serwery API.

Proces w tle (worker) sprawdza plik narzędziem ffprobe, a potem usuwa z niego metadane (miejsce i czas nagrania, aparat, autora, komentarze), przepisując go bez ponownego kodowania. To właśnie ten oczyszczony plik ludzie pobierają. Filmy przesłane przed 18 października 2026 zachowują swoje metadane.

Film w H.264 do 1080p, który przejdzie jeszcze kilka testów, jest tylko przepakowywany, co trwa kilka sekund. Wszystko inne jest konwertowane do H.264 w rozdzielczości do 1080p. Następnie ffmpeg tnie wynik na sześciosekundowe segmenty HLS, które Safari odtwarza natywnie, a inne przeglądarki przez hls.js.

Szyfrowanie segmentów

ffmpeg potrafi sam zaszyfrować HLS, ale chce mieć klucz w pliku na dysku. Nie chcieliśmy klucza na żadnym dysku, więc worker szyfruje segmenty sam:

  • każdy segment jest szyfrowany algorytmem AES-128 w trybie CBC, czyli metodą, którą definiuje standard HLS;
  • klucz ma 16 bajtów, jest inny dla każdego filmu i istnieje tylko w pamięci workera, dopóki ten pracuje;
  • wektorem inicjującym jest numer kolejny segmentu, bo właśnie tego oczekuje odtwarzacz HLS, gdy playlista nie podaje innego.

Do prywatnego zasobnika trafiają tylko zaszyfrowane segmenty i ich playlista. Pliki tymczasowe workera są usuwane po zakończeniu zadania.

Klucze, których nikt nie przechowuje

Potem klucz nie jest nigdzie zapisany. Zamiast generować losowy klucz i go pilnować, tapeshelf wylicza go za każdym razem, gdy jest potrzebny:

klucz filmu = HKDF-SHA256(klucz główny, "video:" + id filmu + wersja) → 16 bajtów

Edycja filmu podnosi wersję, a więc daje mu nowy klucz.

Klucz główny to jeden sekret w konfiguracji serwera. Nie ma go w bazie danych, w zasobnikach ani w kopiach zapasowych. Kopia bazy nie zawiera żadnych kluczy do filmów, a zasobnik tylko zaszyfrowane segmenty, więc atakujący potrzebowałby jeszcze konfiguracji serwera.

Jeśli klucz główny przepadnie, żaden film już się nie odtworzy i żadna kopia zapasowa bazy tego nie naprawi. To ma największe znaczenie, gdy uruchamiasz tapeshelf na własnym serwerze.

Trzy żądania po kliknięciu „odtwórz”

  1. Odtwarzanie. API sprawdza, czy wolno Ci oglądać: jesteś autorem, film jest na Twojej półce albo jest publiczny. Potem zwraca adres playlisty z podpisanym tokenem, który wskazuje film i Ciebie (albo nikogo, jeśli oglądasz bez logowania) i jest ważny godzinę.
  2. Playlista. API ponownie sprawdza token i Twój dostęp i na bieżąco przepisuje playlistę. Każdy segment staje się podpisanym linkiem do magazynu, a wiersz z kluczem wskazuje z powrotem na API.
  3. Klucz. Token musi dotyczyć tego filmu. W przypadku filmu prywatnego Twoja zalogowana sesja musi też należeć do osoby wskazanej w tokenie. Dopiero wtedy API wylicza klucz i wysyła jego 16 bajtów.

Link tymczasowy nie ma konta, które dałoby się sprawdzić, więc na jego stronie token wskazuje link. Każde żądanie sprawdza, czy link nadal działa i nadal zawiera ten film, a token nigdy nie żyje dłużej niż link. Filmy, które gość dostał w wymianie, odtwarzają się tak samo na stronie wymiany, przez tydzień.

Decyzje o dostępie są przez minutę trzymane w pamięci podręcznej, żeby dwugodzinny film nie odpytywał bazy przy każdym żądaniu. Usunięty film można więc jeszcze uruchomić w ciągu tej minuty. Link tymczasowy, który wygaśnie lub zostanie unieważniony, przestaje działać od razu. W obu przypadkach odtwarzacz, który już gra, zachowuje klucz i linki do segmentów i może grać dalej.

Linki do segmentów też są podpisane i wygasają, po godzinie lub później. Odtwarzacz wczytuje playlistę raz, a krótko ważne linki zepsułyby zwykłą pauzę. Gdy link wygaśnie, odtwarzacz prosi o nowe odtwarzanie i gra dalej od tego samego miejsca. Bez klucza segment i tak jest bezużyteczny.

Dlaczego nie ma pliku do przechwycenia

Odtwarzacz nigdy nie dostaje linku do pliku wideo. Dostaje playlistę powiązaną z tokenem, zaszyfrowane kawałki i klucz schowany za kontrolą dostępu. Skopiuj adres playlisty prywatnego filmu do przeglądarki znajomego, a nic się nie odtworzy, bo klucz wymaga Twojej sesji.

Pobieranie to osobna sprawa. Zalogowani mogą pobrać to, co wolno im oglądać. Bez konta można pobierać tylko przez link tymczasowy, który ktoś Ci wysłał, albo przez tydzień to, co dostajesz jako gość w wymianie. Link do pobrania działa dwie minuty.

Z obrazami jest inaczej. Okładki, 16 klatek wyciętych z każdego filmu i zrobiony z nich podgląd leżą w publicznym zasobniku pod długimi losowymi nazwami, a zawartości zasobnika nie da się wylistować. Podgląd prywatnego filmu jest widoczny celowo: pokazuje odwiedzającemu, o co by prosił.

Przed czym to chroni

  • Osoby bez dostępu nie dostaną ani playlisty, ani segmentu, ani klucza.
  • Wyciekły link do segmentu to zaszyfrowany szum. Wyciekły link do playlisty prywatnego filmu nie działa bez sesji osoby, dla której został wydany, a i tak wygasa w ciągu godziny.
  • Skradziona kopia bazy danych nie zdradza żadnych kluczy.

Przed czym nie chroni

  • Kto może oglądać, ten może nagrać. Osoba z dostępem może nagrać ekran albo zapisać stream odpowiednimi narzędziami. Klucz dostała zgodnie z zasadami. tapeshelf nie ma DRM. Prawdziwy DRM, taki jak Widevine czy FairPlay, wymaga komercyjnych serwerów licencji, a i tak nie powstrzyma aparatu skierowanego na ekran.
  • Osoby, którym udostępniasz. Udostępnienie albo wymiana daje drugiej osobie stałą kopię, a ona może pobrać plik. Tak samo każdy, kto otworzy wysłany przez Ciebie link tymczasowy, dopóki ten działa. Co dalej stanie się z plikiem, jest poza naszym zasięgiem. Udostępniaj filmy ludziom, którym ufasz.
  • Sam serwer. To nie jest szyfrowanie end-to-end. Klucze wylicza serwer, więc ten, kto go prowadzi, może odtworzyć każdy film. W tapeshelf.com to my i otwieramy prywatne filmy, gdy jest to potrzebne do prowadzenia i moderowania usługi. Na własnej instancji jest to jej administrator.

Krótka wersja jest na stronie o bezpieczeństwie. Jeśli wolisz sprawdzić, zamiast wierzyć nam na słowo, kod jest otwarty i będzie można uruchomić go samodzielnie.