En esta sección, analizaremos dos estrategias diferentes para encriptar tu contenido multimedia y algunos ejemplos prácticos sobre cómo usarlos con FFmpeg y Shaka Packager. Las dos estrategias de encriptación que analizaremos son Clear Key y el uso de 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 es por eso que un servicio de DRM podría tener más sentido.
Los servicios principales 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:
Encriptación de claves claras
Primero, debes comprender bien qué es Clear Key y qué no es antes de usarla. Cuando no deseas usar un servicio de DRM existente y crees que la encriptación básica de tu contenido multimedia es una opción viable, debes usar Clear Key. Sin embargo, ten en cuenta que este tipo de encriptación no proporciona el mismo nivel de seguridad que usar 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 se generan mediante una clave de desencriptación almacenada en un servidor de licencias. Además, Clear Key envía el par clave-valor como texto simple, de modo que, mientras encriptas tu contenido multimedia, la clave para desencriptarlo no es un secreto.
Crear una clave
Puedes usar el mismo método para crear una clave para DASH y HLS. Hazlo con OpenSSL. El siguiente comando creará una clave de encriptación compuesta por 16 valores hexadecimales.
openssl rand -hex 16 > media.key
Crea 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 el que keys
y key_ids
se proporcionan directamente a Shaka Packager. Lee la documentación para ver más ejemplos.
Para la marca key
, usa la clave creada antes, que se almacena en el archivo media.key
. Sin embargo, cuando lo ingreses en la línea de comandos, asegúrate de quitar los espacios 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 contenido para HLS, necesitas un archivo de información de clave además de un archivo de clave. Un archivo de información clave es un archivo de texto con el siguiente formato. Debe tener la extensión .keyinfo
. Por ejemplo: encrypt.keyinfo
.
key URI
key file path
private key
El URI de clave es donde se ubicará media.key
(creado anteriormente) en tu servidor. La ruta de acceso 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 el IV que creaste antes. Por ejemplo:
https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66
Encriptación 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 de Widevine
Ahora sabes qué es la encriptación con Clear Key y cuándo usarla. Pero, ¿cuándo debes usar un servicio de DRM para obtener seguridad adicional? Aquí es donde se usaría Widevine, o algún otro servicio, para encriptar y desencriptar de forma segura tu contenido multimedia. Widevine admite MPEG-DASH y HLS, y es una DRM de Google. Los navegadores web Google Chrome y Firefox, Android MediaDRM, Android TV y otros dispositivos de electrónica de consumo que usan extensiones de contenido multimedia encriptado y extensiones de fuente de contenido multimedia, en los que Widevine desencripta el contenido, usan Widevine.
Encriptación con Widevine
En la mayoría de los ejemplos de este artículo, se usó la encriptación de Clear Key. Sin embargo, para Widevine debes 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 comando de demultiplexor (demux), excepto el nombre de tus archivos y la marca --content-id
, se debe copiar exactamente del ejemplo. El --content-id
tiene 16 o 32 dígitos hexadecimales aleatorios. Usa las claves que se proporcionan aquí en lugar de las tuyas. Lee la documentación de Shaka Packager sobre cómo usar Widevine Key Server para obtener más ejemplos.
Demux (separa) 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"
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 conversión de medios
En esta sección, se muestran en orden los comandos necesarios para pasar de un archivo .mov
sin procesar a recursos encriptados empaquetados para DASH o HLS. Para ilustrar este objetivo, convertiremos un archivo fuente a una tasa de bits de 8 Mbs con una resolución de 1080p (1920 x 1080). Ajusta estos valores según tus necesidades.
DASH/WebM
Convierte el tipo de archivo y el códec.
En este comando, puedes usar
liborbis
olibopus
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
Crea una clave de encriptación de Clear Key.
openssl rand -hex 16 > media.key
Demux (separa) 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
Remux (combina) 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/MP4
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
Crea una clave de encriptación de Clear Key.
openssl rand -hex 16 > media.key
Demux (separa) 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
Remux (combina) 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/MP4
HLS solo admite MP4, así que primero deberás convertir el archivo al contenedor de MP4 y los códecs compatibles.
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
Crear una clave de encriptación de clave clara
openssl rand -hex 16 > media.key
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
Fue mucho contenido, pero esperamos que ahora puedas encriptar tu contenido multimedia con confianza. A continuación, te mostraremos cómo agregar contenido multimedia a tu sitio.