Ir al contenido
← Todas las entradas

Cómo cifra tapeshelf los videos y por qué no guarda ninguna clave

Un video privado en tapeshelf es para su dueño y para las personas que él elige. Te contamos cómo lo garantiza la app y dónde termina esa protección.

De la subida a la reproducción

Tu navegador sube el archivo directamente a un bucket privado de un almacenamiento compatible con S3, en partes de 16 MB que se reanudan si se corta la conexión. El archivo nunca pasa por los servidores de nuestra API.

Un proceso en segundo plano (el worker) revisa el archivo con ffprobe y luego le quita los metadatos (lugar y hora de la grabación, cámara, autor, comentarios) reescribiéndolo sin volver a codificarlo. Ese archivo limpio es el que la gente descarga. Los videos subidos antes del 18 de octubre de 2026 conservan sus metadatos.

Un video H.264 de hasta 1080p que pasa algunas comprobaciones más solo se reempaqueta, y eso lleva unos segundos. Todo lo demás se convierte a H.264 de hasta 1080p. Después, ffmpeg corta el resultado en segmentos HLS de seis segundos. Safari los reproduce de forma nativa y los demás navegadores, a través de hls.js.

Cifrado de los segmentos

ffmpeg puede cifrar HLS por sí solo, pero necesita la clave en un archivo en disco. No queríamos una clave en ningún disco, así que el worker cifra los segmentos por su cuenta:

  • cada segmento se cifra con AES-128 en modo CBC, el método que define el estándar HLS;
  • la clave tiene 16 bytes, es única para cada video y solo existe en la memoria del worker mientras trabaja;
  • el vector de inicialización es el número de secuencia del segmento, que es lo que asume un reproductor HLS cuando la lista de reproducción no indica otro.

Al bucket privado solo van los segmentos cifrados y su lista de reproducción. Los archivos temporales del worker se borran al terminar el trabajo.

Claves que nunca se guardan

Después de eso, la clave no queda guardada en ningún sitio. En lugar de generar una clave aleatoria y custodiarla, tapeshelf la calcula cada vez que hace falta:

clave del video = HKDF-SHA256(clave maestra, "video:" + id del video + versión) → 16 bytes

Al editar un video sube la versión, y con ella cambia la clave.

La clave maestra es un único secreto en la configuración del servidor. No está en la base de datos, ni en los buckets, ni en las copias de seguridad. Una copia de la base de datos no contiene ninguna clave de video y el bucket solo guarda segmentos cifrados, así que un atacante necesitaría también la configuración del servidor.

Si pierdes la clave maestra, ningún video volverá a reproducirse, y ninguna copia de seguridad de la base de datos lo arregla. Esto importa sobre todo si ejecutas tapeshelf en tu propio servidor.

Tres peticiones al darle a reproducir

  1. Reproducción. La API comprueba que puedes verlo: eres el autor, el video está en tu estante o es público. Luego devuelve la dirección de una lista de reproducción con un token firmado dentro. El token nombra el video y a ti (o a nadie, si no has iniciado sesión) y es válido durante una hora.
  2. Lista de reproducción. La API vuelve a comprobar el token y tu acceso, y reescribe la lista sobre la marcha. Cada segmento pasa a ser un enlace firmado al almacenamiento, y la línea de la clave apunta de nuevo a la API.
  3. Clave. El token tiene que ser de este video. Si el video es privado, además tu sesión tiene que pertenecer a la persona que nombra el token. Solo entonces la API calcula la clave y envía sus 16 bytes.

Un enlace temporal no tiene una cuenta que comprobar, así que en su página el token nombra el enlace. Cada petición comprueba que el enlace sigue funcionando y sigue incluyendo el video, y el token nunca dura más que el enlace. Los videos que un invitado recibió en un intercambio se reproducen igual en la página del intercambio, durante una semana.

Las decisiones de acceso se guardan en caché un minuto, para que una película de dos horas no consulte la base de datos en cada petición. Un video eliminado todavía puede empezar a reproducirse durante ese minuto. Un enlace temporal que vence o se revoca deja de funcionar al instante. En ambos casos, un reproductor que ya está en marcha conserva su clave y sus enlaces de segmentos, y puede seguir reproduciendo.

Los enlaces de los segmentos también están firmados y caducan, al cabo de una hora o más. El reproductor carga la lista una sola vez, y con enlaces muy cortos una simple pausa los rompería. Cuando uno caduca, el reproductor pide una reproducción nueva y sigue desde el mismo punto. Sin la clave, un segmento no sirve de nada.

Por qué no hay ningún archivo que llevarse

El reproductor nunca recibe un enlace al archivo del video. Recibe una lista de reproducción ligada a un token, trozos cifrados y una clave protegida por una comprobación. Si copias la dirección de la lista de un video privado en el navegador de un amigo, no se reproduce nada, porque la clave necesita tu sesión.

La descarga va aparte. Quien ha iniciado sesión puede descargar lo que puede ver. Sin cuenta solo puedes descargar a través de un enlace temporal que alguien te envió, o lo que recibiste como invitado en un intercambio, durante una semana. Un enlace de descarga dura dos minutos.

Las imágenes funcionan de otra manera. Las portadas, los 16 fotogramas que se toman de cada video y la vista previa por fotogramas hecha con ellos están en un bucket público con nombres largos y aleatorios, y el contenido del bucket no se puede listar. La vista previa de un video privado es visible a propósito: le muestra al visitante lo que estaría pidiendo.

De qué protege

  • Quien no tiene acceso no obtiene la lista de reproducción, ni los segmentos, ni la clave.
  • Un enlace de segmento filtrado es ruido cifrado. Un enlace filtrado a la lista de un video privado no funciona sin la sesión de la persona para la que se emitió, y de todos modos caduca en una hora.
  • Una copia robada de la base de datos no revela ninguna clave.

De qué no protege

  • Quien puede ver, puede grabar. Una persona con acceso puede grabar su pantalla o guardar la transmisión con las herramientas adecuadas. Recibió la clave de forma legítima. tapeshelf no tiene DRM. Un DRM de verdad, como Widevine o FairPlay, depende de servidores de licencias comerciales, y aun así no puede impedir que alguien apunte una cámara a la pantalla.
  • Las personas con las que compartes. Compartir o intercambiar le da a la otra persona una copia permanente, y puede descargar el archivo. También puede hacerlo cualquiera que abra un enlace temporal que enviaste, mientras funcione. Lo que pase después con el archivo queda fuera de nuestro alcance. Comparte con gente de confianza.
  • El propio servidor. Esto no es cifrado de extremo a extremo. El servidor calcula las claves, así que quien lo administra puede reproducir cualquier video. En tapeshelf.com somos nosotros, y abrimos videos privados cuando hace falta para operar y moderar el servicio. En una instancia propia, es su administrador.

La versión corta está en la página de seguridad. Si prefieres comprobarlo en lugar de creernos, el código es abierto y podrás ejecutarlo tú mismo.