Encriptación de contenido multimedia

Derek Herman
Derek Herman
Joe Medley
José Medley

En esta sección, analizaremos dos estrategias diferentes para encriptar tus medios y algunos ejemplos prácticos sobre cómo usarlos con FFmpeg y Shaka Packager. Las dos estrategias para la encriptación que analizaremos son Borrar claves y usar un servicio como Google Widevine. Ambas estrategias son una forma de administración de derechos digitales (DRM) para controlar lo que los usuarios pueden hacer con tu contenido multimedia. Sin embargo, uno es inherentemente menos seguro que el otro debido a la forma en que se pasan las claves para la autenticación y por eso un servicio de DRM podría tener más sentido.

Los principales servicios de DRM para la Web son Google Widevine, Microsoft PlayReady y Apple FairPlay, pero no los abordaremos todos en este artículo. Sin embargo, si te orientas a todos los navegadores modernos, es probable que uses los tres servicios de DRM.

La conversión y la encriptación se realizan con estas aplicaciones:

Borrar encriptación de claves

Primero, debes comprender bien qué es Clear Key y qué no es antes de usarla. Cuando no quieras usar un servicio de DRM existente y crees que la encriptación básica de tu contenido multimedia es una opción viable, usa Borrar clave. Sin embargo, ten en cuenta que este tipo de encriptación no proporciona el mismo nivel de seguridad que el uso de uno de los servicios de DRM. Esto se debe a que el par clave-valor no está encriptado con otra clave, a diferencia de las claves encriptadas que genera una clave de desencriptación que se almacena en un servidor de licencias. Además, Clear Key envía el par clave-valor como texto sin formato, por lo que, mientras encriptas tu contenido multimedia, la clave para desencriptarlo no es un secreto.

Crear una clave

Puedes usar el mismo método a fin de crear una clave para DASH y HLS. Para ello, usa OpenSSL. Lo siguiente creará una clave de encriptación compuesta por 16 valores hexadecimales.

openssl rand -hex 16 > media.key

Crear un IV

A continuación, podemos generar un vector de inicialización (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Encriptar con clave clara

En el siguiente ejemplo, se usa Shaka Packager con claves sin procesar, en las que keys y key_ids se proporcionan directamente a Shaka Packager. Consulta la documentación para ver más ejemplos.

Para la marca key, usa la clave que creaste antes, que se almacena en el archivo media.key. Sin embargo, cuando lo ingreses en la línea de comandos, asegúrate de haber quitado su espacio en blanco. Para la marca key_id, repite el valor media.id o usa el valor de IV generado anteriormente.

packager \
  input=glocken.mp4,stream=audio,output=glockena.m4a \
  input=glocken.mp4,stream=video,output=glockenv.mp4 \
  --enable_fixed_key_encryption \
  --keys label=audio:key=INSERT_AUDIO_KEY_HERE:key_id=INSERT_AUDIO_KEY_ID_HERE,label=video:key=INSERT_VIDEO_KEY_HERE:key_id=INSERT_VIDEO_KEY_ID_HERE

Crea un archivo de información de claves

Para encriptar HLS, necesitas un archivo de información de claves, además de un archivo de claves. Un archivo de información clave es un archivo de texto con el siguiente formato. Debería tener la extensión .keyinfo. Por ejemplo: encrypt.keyinfo.

key URI
key file path
private key

En el URI de la clave, se ubicará el media.key (creado anteriormente en tu servidor). La ruta del archivo de claves es su ubicación en relación con el archivo de información de claves. Por último, la clave privada es el contenido del archivo media.key o del IV que creaste antes. Por ejemplo:

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

Encriptar para HLS

packager \
  'input=input.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
  'input=input.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
  --hls_master_playlist_output="master_playlist.m3u8" \
  --hls_base_url="http://localhost:5000/"

Este comando aceptará una clave con 16 o 32 caracteres.

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

Encriptación Widevine

Ahora sabes qué es la encriptación de Clave simple y cuándo usarla. Pero, ¿cuándo deberías usar un servicio de DRM para obtener seguridad adicional? Aquí es donde Widevine (o algún otro servicio) se usaría para encriptar y desencriptar tu contenido multimedia de forma segura. Widevine es compatible con MPEG-DASH y HLS, y es una DRM de Google. Los navegadores web Google Chrome y Firefox, Android MediaDRM, Android TV y otros dispositivos electrónicos de consumo que usan extensiones de medios encriptados y de origen de medios, usan Widevine, en las que Widevine desencripta contenido.

Encriptar con Widevine

En la mayoría de los ejemplos de este artículo, se usó la encriptación de claves claras. Sin embargo, en el caso de Widevine, te convendrá reemplazar las siguientes opciones.

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

Todo el contenido del comando demultiplexer (demux), excepto el nombre de tus archivos y la marca --content-id, debe copiarse exactamente del ejemplo. --content-id tiene 16 o 32 dígitos hexadecimales aleatorios. Usa las claves proporcionadas aquí en lugar de las tuyas. Lee la documentación de Shaka Packager sobre el uso de Widevine Key Server para obtener más ejemplos.

  1. Demux (separar) el audio y el video, encripta los archivos nuevos y genera un archivo de descripción de presentación multimedia (MPD).

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_widevine_encryption \
      --key_server_url "https://license.uat.widevine.com/cenc/getcontentkey/widevine_test" \
      --content_id "fd385d9f9a14bb09" \
      --signer "widevine_test" \
      --aes_signing_key "1ae8ccd0e7985cc0b6203a55855a1034afc252980e970ca90e5202689f947ab9" \
      --aes_signing_iv "d58ce954203b7c9a9a9d467f59839249"
    
  2. Remux (combinar) las transmisiones de audio y video Si usas un framework de video, es posible que no necesites hacerlo.

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
    

Secuencia de conversiones de medios

En esta sección, se muestran los comandos en orden necesarios para pasar de un archivo .mov sin procesar a los recursos encriptados empaquetados para DASH o HLS. A modo de ejemplo, convertiremos un archivo fuente a una tasa de bits de 8 MB a una resolución de 1080p (1920 x 1080). Ajusta estos valores según tus necesidades.

DASH y WebM

  1. Convierte el tipo de archivo y el códec.

    En este comando, puedes usar liborbis o libopus para el códec de audio.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Crea una clave de encriptación de clave clara.

    openssl rand -hex 16 > media.key
    
  3. Demux (separar) el audio y el video, encripta los archivos nuevos y genera un archivo de descripción de presentación multimedia (MPD).

    packager \
      input=tmp_glocken.webm,stream=video,output=glocken_video.webm \
      input=tmp_glocken.webm,stream=audio,output=glocken_audio.webm \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_webm_vod.mpd
    
  4. Remux (combinar) las transmisiones de audio y video Si usas un framework de video, es posible que no necesites hacerlo.

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

DASH y MP4

  1. Convierte el tipo de archivo, el códec de video y la tasa de bits.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Crea una clave de encriptación de clave clara.

    openssl rand -hex 16 > media.key
    
  3. Demux (separar) el audio y el video, encripta los archivos nuevos y genera un archivo de descripción de presentación multimedia (MPD).

    packager \
      input=tmp_glocken.mp4,stream=video,output=glocken_video.mp4 \
      input=tmp_glocken.mp4,stream=audio,output=glocken_audio.m4a \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE \
      --mpd_output glocken_mp4_vod.mpd
    
  4. Remux (combinar) las transmisiones de audio y video Si usas un framework de video, es posible que no necesites hacerlo.

    ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
    

HLS y MP4

HLS solo es compatible con MP4, por lo que primero deberás convertirlo al contenedor de MP4 y a los códecs compatibles.

  1. Convierte el tipo de archivo, el códec de video y la tasa de bits.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Crea una clave de encriptación de clave clara.

    openssl rand -hex 16 > media.key
    
  3. Crea un archivo de información de claves

    packager \
      'input=glocken.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
      'input=glocken.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
      --hls_master_playlist_output="master_playlist.m3u8" \
      --hls_base_url="http://localhost:5000/" \
      --enable_fixed_key_encryption \
      --enable_fixed_key_decryption \
      --keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
    

Aunque fue mucha información que asimilar, esperamos que ahora puedas encriptar tu contenido multimedia con confianza. A continuación, te mostraremos cómo agregar contenido multimedia a tu sitio.