Criptografia de mídia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Nesta seção, abordaremos duas estratégias diferentes para criptografar sua mídia e alguns exemplos práticos sobre como usá-las com o FFmpeg e o Shaka Packager. As duas estratégias de criptografia que vamos discutir são Clear Key e usar um serviço como o Google Widevine. As duas estratégias são uma forma de gerenciamento de direitos digitais (DRM, na sigla em inglês) para controlar o que os usuários podem fazer com a mídia. No entanto, um é inerentemente menos seguro que o outro devido à maneira como as chaves são transmitidas para autenticação, e é por isso que um serviço de DRM pode fazer mais sentido.

Os principais serviços de DRM para a Web são Google Widevine, Microsoft PlayReady e Apple FairPlay, mas não abordaremos todos eles neste artigo. No entanto, se você estiver segmentando todos os navegadores modernos, provavelmente usará todos os três serviços de DRM.

A conversão e a criptografia são feitas com estes aplicativos:

Limpar criptografia de chaves

Primeiro, é preciso entender bem o que é a Clear Key e o que não é antes de usá-la. Quando você não quiser usar um serviço DRM existente e achar que a criptografia básica da sua mídia é uma opção viável, use a tecla "Clear Key". No entanto, esse tipo de criptografia não oferece o mesmo nível de segurança que o uso de um dos serviços de DRM. Isso ocorre porque o par de chave-valor não é criptografado com outra chave, ao contrário das chaves criptografadas que são geradas por uma chave de descriptografia armazenada em um servidor de licença. Além disso, a opção "Limpar chave" envia o par de chave-valor como texto simples. Assim, enquanto você criptografa sua mídia, a chave para descriptografar ela não é um secret.

Crie uma chave

É possível usar o mesmo método para criar uma chave para DASH e HLS. Faça isso usando o OpenSSL. O comando a seguir vai criar uma chave de criptografia composta por 16 valores hexadecimais.

openssl rand -hex 16 > media.key

Criar um IV

Em seguida, é possível gerar um vetor de inicialização (IV, na sigla em inglês).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Criptografar com chave limpa

O exemplo a seguir usa o Shaka Packager com chaves brutas, em que keys e key_ids são fornecidos diretamente ao Shaka Packager. Leia a documentação para mais exemplos.

Para a sinalização key, use a chave criada anteriormente, que está armazenada no arquivo media.key. No entanto, ao inseri-lo na linha de comando, remova o espaço em branco. Para a sinalização key_id, repita o valor media.id ou use o valor de IV gerado acima.

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

Criar um arquivo de informações de chave

Para criptografar para HLS, você precisa de um arquivo de informações de chave, além de um arquivo de chave. Um arquivo de informações de chave é um arquivo de texto com o formato abaixo. Ele precisa ter a extensão .keyinfo. Por exemplo, encrypt.keyinfo.

key URI
key file path
private key

O URI da chave é onde o media.key (criado acima) será localizado no seu servidor. O caminho do arquivo de chave é a localização dele em relação ao arquivo de informações de chave. Por fim, a chave privada é o conteúdo do próprio arquivo media.key ou do IV criado antes. Exemplo:

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

Criptografar 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/"

Esse comando aceita uma chave com 16 ou 32 caracteres.

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

Criptografia Widevine

Agora você sabe o que é a criptografia de chaves claras e quando usá-la. Mas quando você deve usar um serviço de DRM para segurança adicional? É aqui que o Widevine, ou outro serviço, seria usado para criptografar e descriptografar sua mídia com segurança. O Widevine oferece suporte a MPEG-DASH e HLS e é um DRM do Google. O Widevine é usado pelos navegadores Google Chrome e Firefox, Android MediaDRM, Android TV e outros dispositivos eletrônicos de consumo que usam APIs Encrypted Media Extensions e Media Source Extensions, em que o Widevine descriptografa conteúdo.

Criptografar com Widevine

A maioria dos exemplos neste artigo usou a criptografia Clear Key. No entanto, para Widevine, é melhor substituir as opções a seguir.

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

Tudo o que está no comando demultiplexador (demux), exceto o nome dos arquivos e a sinalização --content-id, precisa ser copiado exatamente do exemplo. O --content-id tem 16 ou 32 dígitos hexadecimais aleatórios. Use as chaves fornecidas aqui em vez das suas. Leia a documentação do Shaka Packager sobre como usar o servidor de chaves Wivine para ver mais exemplos.

  1. Demux (separe) o áudio e o vídeo, criptografar os novos arquivos e gerar um arquivo de descrição de apresentação de mídia (MPD, na sigla em inglês).

    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) os streams de áudio e vídeo. Se você estiver usando uma estrutura de vídeo, talvez não precise fazer isso.

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

Sequência de conversão de mídia

Esta seção mostra a ordem dos comandos necessários para ir de um arquivo .mov bruto para recursos criptografados em pacotes para DASH ou HLS. Para ilustrar, estamos convertendo um arquivo de origem para uma taxa de bits de 8 Mbs com uma resolução de 1080p (1920 x 1080). Ajuste esses valores conforme suas necessidades.

DASH/WebM

  1. Converta o codec e o tipo de arquivo.

    Para este comando, você pode usar liborbis ou libopus para o codec de áudio.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Crie uma chave de criptografia de chave clara.

    openssl rand -hex 16 > media.key
    
  3. Demux (separe) o áudio e o vídeo, criptografar os novos arquivos e gerar um arquivo de descrição de apresentação de mídia (MPD, na sigla em inglês).

    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) os streams de áudio e vídeo. Se você estiver usando uma estrutura de vídeo, talvez não precise fazer isso.

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

DASH/MP4

  1. Converta o tipo de arquivo, o codec de vídeo e a taxa de bits.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Crie uma chave de criptografia de chave clara.

    openssl rand -hex 16 > media.key
    
  3. Demux (separe) o áudio e o vídeo, criptografar os novos arquivos e gerar um arquivo de descrição de apresentação de mídia (MPD, na sigla em inglês).

    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) os streams de áudio e vídeo. Se você estiver usando uma estrutura de vídeo, talvez não precise fazer isso.

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

HLS/MP4

O HLS só oferece suporte a MP4. Portanto, primeiro é necessário fazer a conversão para o contêiner MP4 e para os codecs compatíveis.

  1. Converta o tipo de arquivo, o codec de vídeo e a taxa de bits.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Crie uma chave de criptografia de chave clara.

    openssl rand -hex 16 > media.key
    
  3. Criar um arquivo de informações de chave

    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
    

Isso foi muito para digerir, mas espero que agora você consiga criptografar sua mídia com confiança. A seguir, mostraremos como adicionar mídia ao seu site.