Como o tapeshelf criptografa vídeos e por que não guarda chaves

Um vídeo privado no tapeshelf é para o dono e para as pessoas que ele escolheu. Veja como o app garante isso e onde a proteção termina.
Do envio ao streaming
O seu navegador envia o arquivo direto para um bucket privado num armazenamento compatível com S3, em partes de 16 MB. Se a conexão cair, o envio continua de onde parou. O arquivo nunca passa pelos nossos servidores de API.
Um worker em segundo plano verifica o arquivo com o ffprobe e depois remove os metadados (local e hora da gravação, câmera, autor, comentários), regravando o arquivo sem recodificar. Esse arquivo limpo é o que as pessoas baixam. Vídeos enviados antes de 18 de outubro de 2026 mantêm os metadados.
Um vídeo em H.264 de até 1080p que passa por mais algumas verificações só é reempacotado, o que leva segundos. Todo o resto é convertido para H.264 de até 1080p. Depois o ffmpeg corta o resultado em segmentos HLS de seis segundos. O Safari reproduz esses segmentos nativamente, e os outros navegadores usam o hls.js.
Criptografando os segmentos
O ffmpeg sabe criptografar HLS sozinho, mas exige a chave num arquivo em disco. Não queríamos a chave em disco nenhum, então o próprio worker criptografa os segmentos:
- cada segmento é criptografado com AES-128 no modo CBC, o método definido pelo padrão HLS;
- a chave tem 16 bytes, é exclusiva do vídeo e só existe na memória do worker enquanto ele trabalha;
- o vetor de inicialização é o número de sequência do segmento, que é o que um player HLS usa quando a playlist não indica outro.
Só os segmentos criptografados e a playlist deles vão para o bucket privado. Os arquivos temporários do worker são apagados quando a tarefa termina.
Chaves que nunca são guardadas
Depois disso, a chave não fica guardada em lugar nenhum. Em vez de gerar uma chave aleatória e ter que protegê-la, o tapeshelf calcula a chave de novo toda vez que precisa dela:
chave do vídeo = HKDF-SHA256(chave mestra, "video:" + id do vídeo + versão) → 16 bytes
Editar um vídeo aumenta a versão, e com isso ele ganha uma chave nova.
A chave mestra é um único segredo na configuração do servidor. Ela não está no banco de dados, nos buckets nem nos backups. Uma cópia do banco não tem nenhuma chave de vídeo e o bucket só tem segmentos criptografados, então um atacante precisaria também da configuração do servidor.
Se a chave mestra se perder, nenhum vídeo volta a tocar, e nenhum backup do banco resolve isso. Isso importa principalmente se você roda o tapeshelf no seu próprio servidor.
Três requisições quando você dá play
- Reprodução. A API verifica se você pode assistir: você é o autor, o vídeo está na sua estante ou ele é público. Então devolve o endereço de uma playlist com um token assinado, válido por uma hora. O token indica o vídeo e você (ou ninguém, se você não entrou na sua conta).
- Playlist. A API verifica de novo o token e o seu acesso e reescreve a playlist na hora. Cada segmento vira um link assinado do armazenamento, e a linha da chave aponta de volta para a API.
- Chave. O token precisa ser deste vídeo. Num vídeo privado, a sessão em que você entrou também precisa ser da pessoa indicada no token. Só então a API calcula a chave e envia os 16 bytes.
Um link temporário não tem conta para verificar, então, na página dele, o token indica o próprio link. Cada requisição confere se o link ainda funciona e ainda contém o vídeo, e o token nunca dura mais que o link. Os vídeos que um convidado recebeu numa troca tocam do mesmo jeito na página da troca, durante uma semana.
As decisões de acesso ficam em cache por um minuto, para que um filme de duas horas não consulte o banco a cada requisição. Um vídeo excluído ainda pode ser iniciado dentro desse minuto. Um link temporário que expira ou é revogado para de funcionar na hora. Nos dois casos, um player que já está tocando mantém a chave e os links dos segmentos e pode continuar.
Os links dos segmentos também são assinados e expiram, depois de uma hora ou mais. O player carrega a playlist uma vez só, e links curtos quebrariam até uma simples pausa. Quando um link expira, o player pede uma nova reprodução e continua do mesmo ponto. Sem a chave, um segmento não serve para nada mesmo.
Por que não existe um arquivo para levar
O player nunca recebe um link para o arquivo do vídeo. Ele recebe uma playlist presa a um token, pedaços criptografados e uma chave que só sai depois de uma verificação. Se você copiar o endereço da playlist de um vídeo privado no navegador de um amigo, nada vai tocar, porque a chave exige a sua sessão.
Baixar é outra coisa. Quem entrou na conta pode baixar o que pode assistir. Sem conta, você só pode baixar por um link temporário que alguém mandou para você, ou o que recebeu como convidado numa troca, durante uma semana. Um link de download vale por dois minutos.
Com imagens é diferente. As capas, os 16 quadros tirados de cada vídeo e a prévia em quadros montada a partir deles ficam num bucket público, com nomes longos e aleatórios, e não dá para listar o conteúdo desse bucket. A prévia de um vídeo privado fica visível de propósito: ela mostra ao visitante o que ele estaria pedindo.
Contra o que isso protege
- Quem não tem acesso não recebe playlist, segmento nem chave.
- Um link de segmento vazado é só ruído criptografado. Um link vazado da playlist de um vídeo privado não funciona sem a sessão da pessoa para quem ele foi emitido, e expira em uma hora de qualquer jeito.
- Uma cópia roubada do banco de dados não revela nenhuma chave.
Contra o que não protege
- Quem pode assistir pode gravar. Uma pessoa com acesso pode gravar a tela ou salvar o stream com as ferramentas certas. A chave foi entregue a ela de forma legítima. O tapeshelf não tem DRM. Um DRM de verdade, como Widevine ou FairPlay, depende de servidores de licença comerciais e mesmo assim não impede uma câmera apontada para a tela.
- As pessoas com quem você compartilha. Compartilhar ou trocar dá à outra pessoa uma cópia permanente, e ela pode baixar o arquivo. Qualquer pessoa que abrir um link temporário que você mandou também pode, enquanto ele funcionar. O que acontece com o arquivo depois está fora do nosso alcance. Compartilhe com quem você confia.
- O próprio servidor. Isto não é criptografia de ponta a ponta. O servidor calcula as chaves, então quem administra o servidor pode reproduzir qualquer vídeo. No tapeshelf.com somos nós, e abrimos vídeos privados quando isso é necessário para operar e moderar o serviço. Numa instância hospedada por conta própria, é o administrador.
O resumo está na página de segurança. Se você prefere conferir em vez de acreditar na nossa palavra, o código é aberto e você vai poder rodá-lo por conta própria.