Så krypterar tapeshelf video, och varför inga nycklar sparas

En privat video på tapeshelf är till för ägaren och de personer som ägaren har valt. Så här ser appen till att det håller, och här slutar skyddet.
Från uppladdning till ström
Din webbläsare laddar upp filen direkt till en privat bucket i S3-kompatibel lagring, i delar på 16 MB som fortsätter där de slutade om anslutningen bryts. Filen passerar aldrig våra API-servrar.
En worker i bakgrunden kontrollerar filen med ffprobe och tar sedan bort dess metadata (plats och tid för inspelningen, kamera, skapare, kommentarer) genom att skriva om filen utan att koda om den. Det är den rensade filen som andra laddar ner. Videor som laddades upp före den 18 oktober 2026 har kvar sin metadata.
H.264-video i upp till 1080p som klarar några kontroller till paketeras bara om, vilket tar några sekunder. Allt annat konverteras till H.264 i upp till 1080p. Sedan delar ffmpeg upp resultatet i HLS-segment på sex sekunder, som Safari spelar upp direkt och andra webbläsare spelar upp via hls.js.
Segmenten krypteras
ffmpeg kan kryptera HLS på egen hand, men då vill det ha nyckeln i en fil på disken. Vi ville inte ha någon nyckel på någon disk, så workern krypterar segmenten själv:
- varje segment krypteras med AES-128 i CBC-läge, metoden som HLS-standarden anger;
- nyckeln är 16 byte, unik för videon, och finns bara i workerns minne medan den arbetar;
- initieringsvektorn är segmentets löpnummer, vilket är vad en HLS-spelare utgår från när spellistan inte anger någon.
Bara de krypterade segmenten och deras spellista hamnar i den privata bucketen. Workerns tillfälliga filer raderas när jobbet är klart.
Nycklar som aldrig sparas
Efter det sparas nyckeln ingenstans. I stället för att skapa en slumpmässig nyckel och vakta den tar tapeshelf fram den varje gång den behövs:
video key = HKDF-SHA256(master key, "video:" + video id + version) → 16 bytes
När en video redigeras höjs versionen, och då får den en ny nyckel.
Huvudnyckeln är en enda hemlighet i serverns konfiguration. Den finns inte i databasen, i bucketarna eller i säkerhetskopiorna. En kopia av databasen innehåller inga videonycklar och bucketen innehåller bara krypterade segment, så en angripare skulle också behöva serverns konfiguration.
Förlorar man huvudnyckeln går ingen video att spela upp igen, och ingen säkerhetskopia av databasen kan rädda det. Det spelar störst roll om du kör tapeshelf på din egen server.
Tre förfrågningar när du trycker på play
- Uppspelning. API:t kontrollerar att du får titta: du är skaparen, videon finns på din hylla eller den är offentlig. Sedan returnerar det en adress till spellistan med en signerad token i, som anger videon och dig (eller ingen, om du inte är inloggad) och gäller i en timme.
- Spellista. API:t kontrollerar token och din behörighet igen och skriver om spellistan i farten. Varje segment blir en signerad lagringslänk, och nyckelraden pekar tillbaka på API:t.
- Nyckel. Token måste gälla den här videon. För en privat video måste din inloggade session dessutom höra till den person som anges i token. Först då tar API:t fram nyckeln och skickar dess 16 byte.
En tillfällig länk har inget konto att kontrollera, så på dess sida anger token länken. Varje förfrågan kontrollerar att länken fortfarande fungerar och fortfarande innehåller videon, och token lever aldrig längre än länken. Videor som en gäst har fått i ett byte spelas upp på samma sätt på bytessidan, i en vecka.
Behörighetsbesluten cachas i en minut, så att en film på två timmar inte belastar databasen vid varje förfrågan. En raderad video kan alltså fortfarande startas inom den minuten. En tillfällig länk som går ut eller återkallas slutar fungera direkt. Oavsett vilket behåller en spelare som redan är igång sin nyckel och sina segmentlänkar och kan spela vidare.
Segmentlänkarna är också signerade och går ut, efter en timme eller mer. Spelaren laddar spellistan en gång, och korta länkar skulle göra att en vanlig paus fick allt att sluta fungera. När en länk går ut ber spelaren om en ny uppspelning och fortsätter från samma ställe. Utan nyckeln är ett segment ändå värdelöst.
Varför det inte finns någon fil att ta
Spelaren får aldrig någon länk till själva videofilen. Den får en spellista som är bunden till en token, krypterade bitar och en nyckel bakom en kontroll. Kopiera adressen till en privat videos spellista till en väns webbläsare, så spelas ingenting upp, eftersom nyckeln kräver din session.
Nedladdning är en separat sak. Den som är inloggad kan ladda ner det hen får titta på. Utan konto kan du bara ladda ner via en tillfällig länk som någon har skickat till dig, eller det du har fått som gäst i ett byte, i en vecka. En nedladdningslänk gäller i två minuter.
Bilder fungerar annorlunda. Omslag, de 16 bildrutorna som tas ur varje video och förhandsvisningen som skapas av dem ligger i en offentlig bucket under långa slumpmässiga namn, och bucketen går inte att lista. En privat videos förhandsvisning syns med avsikt: den visar besökaren vad hen skulle be om.
Vad det här skyddar mot
- Den som saknar behörighet får ingen spellista, inget segment och ingen nyckel.
- En läckt segmentlänk är krypterat brus. En läckt spellistlänk till en privat video fungerar inte utan sessionen hos den person den utfärdades till, och den går ändå ut inom en timme.
- En stulen kopia av databasen avslöjar inga nycklar.
Vad det inte skyddar mot
- Den som kan titta kan spela in. En person med behörighet kan spela in skärmen eller spara strömmen med rätt verktyg. Personen har fått nyckeln på riktigt. tapeshelf har ingen DRM. Riktig DRM som Widevine eller FairPlay kräver kommersiella licensservrar, och den kan ändå inte stoppa en kamera som riktas mot en skärm.
- De du delar med. En delning eller ett byte ger den andra personen en permanent kopia, och hen kan ladda ner filen. Det kan också alla som öppnar en tillfällig länk som du har skickat, så länge den fungerar. Vad som sedan händer med filen ligger utom vår räckvidd. Dela med personer du litar på.
- Själva servern. Det här är inte end-to-end-kryptering. Servern tar fram nycklarna, så den som driver den kan spela upp vilken video som helst. På tapeshelf.com är det vi, och vi öppnar privata videor när det behövs för att driva och moderera tjänsten. På en egen server är det administratören.
Den korta versionen finns på säkerhetssidan. Om du hellre kontrollerar själv än tar vårt ord för det: koden är öppen källkod, och du kommer att kunna köra den själv.