Vai al contenuto
← Tutti gli articoli

Come tapeshelf cifra i video, e perché non conserva le chiavi

Un video privato su tapeshelf è per chi lo possiede e per le persone che ha scelto. Ecco come l’app mantiene questa promessa, e dove finisce la protezione.

Dal caricamento allo streaming

Il browser carica il file direttamente in un bucket privato di uno storage compatibile con S3, in parti da 16 MB che riprendono da dove si erano fermate se la connessione cade. Il file non passa mai dai nostri server API.

Un worker in background controlla il file con ffprobe, poi ne elimina i metadati (luogo e ora delle riprese, fotocamera, autore, commenti) riscrivendolo senza ricodificarlo. Quel file ripulito è quello che le persone scaricano. I video caricati prima del 18 ottobre 2026 mantengono i loro metadati.

Un video H.264 fino a 1080p che supera qualche altro controllo viene solo reimpacchettato, e bastano pochi secondi. Tutto il resto viene convertito in H.264 fino a 1080p. Poi ffmpeg taglia il risultato in segmenti HLS da sei secondi, che Safari riproduce da sé e gli altri browser tramite hls.js.

La cifratura dei segmenti

ffmpeg sa cifrare l’HLS da solo, ma vuole la chiave in un file sul disco. Noi non volevamo chiavi su nessun disco, quindi è il worker a cifrare i segmenti:

  • ogni segmento è cifrato con AES-128 in modalità CBC, il metodo previsto dallo standard HLS;
  • la chiave è di 16 byte, è diversa per ogni video ed esiste solo nella memoria del worker mentre lavora;
  • il vettore di inizializzazione è il numero di sequenza del segmento, cioè quello che un player HLS presume quando la playlist non ne indica uno.

Nel bucket privato finiscono solo i segmenti cifrati e la loro playlist. I file temporanei del worker vengono cancellati alla fine del lavoro.

Chiavi che non vengono mai salvate

Dopo di che la chiave non viene conservata da nessuna parte. Invece di generare una chiave casuale e custodirla, tapeshelf la ricava ogni volta che serve:

video key = HKDF-SHA256(master key, "video:" + video id + version) → 16 bytes

Modificare un video ne aumenta la versione, e quindi gli dà una chiave nuova.

La chiave principale è un unico segreto nella configurazione del server. Non sta nel database, nei bucket o nei backup. Una copia del database non contiene chiavi dei video e il bucket contiene solo segmenti cifrati, quindi a un attaccante servirebbe anche la configurazione del server.

Se perdi la chiave principale, nessun video si potrà più riprodurre, e nessun backup del database la riporterà indietro. Conta soprattutto se usi tapeshelf sul tuo server.

Tre richieste quando premi play

  1. Riproduzione. L’API controlla che tu possa guardare: sei l’autore, il video è sul tuo scaffale oppure è pubblico. Poi restituisce l’indirizzo di una playlist con dentro un token firmato, che indica il video e te (o nessuno, se non hai effettuato l’accesso), valido per un’ora.
  2. Playlist. L’API verifica di nuovo il token e il tuo accesso e riscrive la playlist al volo. Ogni segmento diventa un link firmato allo storage, e la riga della chiave rimanda all’API.
  3. Chiave. Il token deve riguardare questo video. Per un video privato, anche la sessione con cui hai effettuato l’accesso deve appartenere alla persona indicata nel token. Solo allora l’API ricava la chiave e ne invia i 16 byte.

Un link temporaneo non ha un account da controllare, quindi sulla sua pagina il token indica il link. A ogni richiesta si verifica che il link funzioni ancora e contenga ancora il video, e il token non dura mai più del link. I video che un ospite ha ricevuto in uno scambio si riproducono allo stesso modo sulla pagina dello scambio, per una settimana.

Le decisioni sull’accesso restano in cache per un minuto, così un film di due ore non interroga il database a ogni richiesta. Un video eliminato può quindi ancora partire entro quel minuto. Un link temporaneo scaduto o revocato smette invece subito di funzionare. In entrambi i casi, un player già in riproduzione conserva la chiave e i link dei segmenti e può andare avanti.

Anche i link dei segmenti sono firmati e scadono, dopo un’ora o più. Il player carica la playlist una volta sola, e con link troppo brevi basterebbe una pausa per interrompere tutto. Quando uno scade, il player chiede una nuova riproduzione e riparte dallo stesso punto. Senza la chiave, comunque, un segmento non serve a niente.

Perché non c’è nessun file da prendere

Il player non riceve mai un link al file del video. Riceve una playlist legata a un token, pezzi cifrati e una chiave protetta da un controllo. Se copi l’indirizzo della playlist di un video privato nel browser di un amico, non si vede niente, perché la chiave richiede la tua sessione.

Scaricare è un’altra cosa. Chi ha effettuato l’accesso può scaricare ciò che può guardare. Senza account puoi scaricare solo tramite un link temporaneo che qualcuno ti ha mandato, oppure, per una settimana, ciò che hai ricevuto come ospite in uno scambio. Un link per il download dura due minuti.

Le immagini funzionano in modo diverso. Le copertine, i 16 fotogrammi estratti da ogni video e l’anteprima costruita con quelli stanno in un bucket pubblico con nomi lunghi e casuali, e il contenuto del bucket non si può elencare. L’anteprima di un video privato è visibile di proposito: mostra al visitatore cosa sta per chiedere.

Da cosa protegge

  • Chi non ha accesso non riceve né la playlist, né i segmenti, né la chiave.
  • Il link trapelato di un segmento porta solo a rumore cifrato. Il link trapelato della playlist di un video privato non funziona senza la sessione della persona a cui è stato rilasciato, e comunque scade entro un’ora.
  • Una copia rubata del database non rivela nessuna chiave.

Da cosa non protegge

  • Chi può guardare può registrare. Una persona con accesso può registrare lo schermo o salvare lo stream con gli strumenti giusti. La chiave le è stata data legittimamente. tapeshelf non ha DRM. Un vero DRM come Widevine o FairPlay dipende da server di licenza commerciali, e non può comunque fermare una fotocamera puntata sullo schermo.
  • Le persone con cui condividi. Una condivisione o uno scambio dà all’altra persona una copia permanente, e lei può scaricare il file. Lo stesso vale per chiunque apra un link temporaneo che hai mandato, finché funziona. Cosa succede al file dopo è fuori dalla nostra portata. Condividi con persone di cui ti fidi.
  • Il server stesso. Questa non è una cifratura end-to-end. È il server a ricavare le chiavi, quindi chi lo gestisce può riprodurre qualsiasi video. Su tapeshelf.com siamo noi, e apriamo i video privati quando serve per far funzionare e moderare il servizio. Su un’istanza self-hosted è l’amministratore.

La versione breve è nella pagina sulla sicurezza. Se preferisci verificare invece di fidarti sulla parola, il codice è open source, e potrai installarlo sul tuo server.