Přeskočit na obsah
← Všechny články

Jak tapeshelf šifruje videa a proč neukládá klíče

Soukromé video na tapeshelf patří vlastníkovi a lidem, které si sám vybral. Ukážeme, jak to aplikace hlídá a kde její ochrana končí.

Od nahrání po přehrávání

Prohlížeč nahrává soubor přímo do soukromého bucketu v úložišti kompatibilním s S3, po částech o 16 MB. Když spojení vypadne, nahrávání pokračuje tam, kde skončilo. Přes naše API servery soubor vůbec nejde.

Worker na pozadí soubor zkontroluje nástrojem ffprobe a odstraní z něj metadata: místo a čas natáčení, kameru, autora, komentáře. Soubor se přitom jen přepíše bez překódování. Lidé si stahují právě takto vyčištěný soubor. Videa nahraná před 18. říjnem 2026 metadata dál mají.

Video v H.264 do 1080p, které projde ještě několika kontrolami, stačí přebalit, a to trvá pár sekund. Všechno ostatní se převede do H.264 do 1080p. ffmpeg pak výsledek rozřeže na šestisekundové segmenty HLS. Safari je přehraje samo, ostatní prohlížeče přes hls.js.

Šifrování segmentů

ffmpeg umí HLS zašifrovat i sám, jenže klíč potřebuje mít v souboru na disku. My jsme klíč na disku mít nechtěli, a tak segmenty šifruje worker sám:

  • každý segment se šifruje algoritmem AES-128 v režimu CBC, jak to určuje standard HLS;
  • klíč má 16 bajtů, každé video má vlastní a existuje jen v paměti workeru, dokud pracuje;
  • inicializační vektor je pořadové číslo segmentu, které přehrávač HLS použije sám, když playlist neuvádí jiný.

Do soukromého bucketu jdou jen zašifrované segmenty a jejich playlist. Dočasné soubory worker po skončení úlohy smaže.

Klíče, které se nikde neukládají

Potom už klíč nikde uložený není. Místo náhodného klíče, který by se musel někde držet a hlídat, si ho tapeshelf pokaždé znovu odvodí:

klíč videa = HKDF-SHA256(hlavní klíč, "video:" + id videa + verze) → 16 bajtů

Úprava videa zvýší verzi, takže upravené video dostane nový klíč.

Hlavní klíč je jedno tajemství v konfiguraci serveru. Není v databázi, v bucketech ani v zálohách. Kopie databáze neobsahuje žádný klíč videa a v bucketu leží jen zašifrované segmenty, takže útočník by potřeboval i konfiguraci serveru.

Když hlavní klíč ztratíte, žádné video se už nepřehraje a záloha databáze ho nevrátí. Na tom nejvíc záleží, pokud tapeshelf provozujete na vlastním serveru.

Tři požadavky po stisknutí play

  1. Přehrání. API ověří, že video smíte vidět: jste jeho autor, máte ho na polici, nebo je veřejné. Pak vrátí adresu playlistu s podepsaným tokenem platným hodinu. Token určuje video a vás (nebo nikoho, pokud nejste přihlášení).
  2. Playlist. API znovu ověří token i vaše oprávnění a playlist za běhu přepíše. Z každého segmentu se stane podepsaný odkaz do úložiště a řádek s klíčem ukazuje zpátky na API.
  3. Klíč. Token musí být vydaný pro toto video. U soukromého videa musí navíc vaše přihlášená relace patřit tomu, na koho token zní. Teprve potom API klíč odvodí a pošle jeho 16 bajtů.

Dočasný odkaz nemá žádný účet, který by se dal ověřit, a tak token na jeho stránce zní na samotný odkaz. Každý požadavek ověří, že odkaz pořád platí a video v něm pořád je, a token nikdy nežije déle než odkaz. Videa, která host dostal ve výměně, se stejně přehrávají na stránce výměny, a to týden.

Rozhodnutí o přístupu se na minutu ukládá do mezipaměti, aby dvouhodinový film nezatěžoval databázi při každém požadavku. Smazané video se tedy během té minuty ještě dá spustit. Dočasný odkaz, který vyprší nebo ho zrušíte, přestane fungovat hned. V obou případech si ale přehrávač, který už běží, ponechá klíč i odkazy na segmenty a může hrát dál.

Odkazy na segmenty jsou také podepsané a vyprší, nejdřív za hodinu. Přehrávač načte playlist jen jednou a krátce platné odkazy by rozbily i obyčejnou pauzu. Když odkaz vyprší, přehrávač si požádá o nové přehrání a pokračuje od stejného místa. Bez klíče je segment stejně k ničemu.

Proč tu není soubor, který by šlo odnést

Přehrávač nikdy nedostane odkaz na samotný soubor s videem. Dostane playlist vázaný na token, zašifrované kousky a klíč, ke kterému se dostane jen přes kontrolu. Když adresu playlistu soukromého videa zkopírujete do prohlížeče kamaráda, nic se nepřehraje, protože klíč vyžaduje vaši relaci.

Stahování je samostatný krok. Přihlášení lidé si mohou stáhnout to, co smějí vidět. Bez účtu jde stahovat jen přes dočasný odkaz, který vám někdo poslal, nebo po dobu jednoho týdne to, co jste jako host dostali ve výměně. Odkaz ke stažení platí dvě minuty.

S obrázky je to jinak. Obálky, 16 snímků z každého videa a náhled ze snímků, který se z nich skládá, leží ve veřejném bucketu pod dlouhými náhodnými názvy a obsah bucketu nejde vypsat. Náhled soukromého videa je vidět záměrně: návštěvník z něj pozná, o co by žádal.

Před čím to chrání

  • Kdo nemá přístup, nedostane playlist, segment ani klíč.
  • Uniklý odkaz na segment je jen zašifrovaný šum. Uniklý odkaz na playlist soukromého videa nefunguje bez relace člověka, kterému byl vydán, a stejně do hodiny vyprší.
  • Ukradená kopie databáze neprozradí žádný klíč.

Před čím ne

  • Kdo se může dívat, může i nahrávat. Člověk s přístupem si může nahrát obrazovku nebo vhodnými nástroji uložit stream. Klíč dostal oprávněně. tapeshelf nemá DRM. Skutečné DRM, třeba Widevine nebo FairPlay, závisí na komerčních licenčních serverech a stejně nic nezmůže proti kameře namířené na obrazovku.
  • Lidé, se kterými sdílíte. Sdílení nebo výměna dává druhému trvalou kopii a ten si může soubor stáhnout. Stejně tak kdokoli, kdo otevře dočasný odkaz, který jste poslali, dokud platí. Co se se souborem stane potom, už neovlivníme. Sdílejte s lidmi, kterým věříte.
  • Samotný server. Nejde o koncové šifrování. Klíče odvozuje server, takže kdo ho provozuje, může přehrát jakékoli video. Na tapeshelf.com jsme to my a soukromá videa otevíráme, když je to potřeba pro provoz služby a moderování. Na vlastní instanci je to její administrátor.

Stručné shrnutí najdete na stránce o zabezpečení. Pokud nám nechcete věřit na slovo a radši si to ověříte, kód je otevřený a brzy si ho budete moct spustit sami.