Criptografia de mídia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Nesta seção, vamos abordar duas estratégias diferentes de criptografia da mídia e alguns exemplos práticos de como usá-las com o FFmpeg e o Shaka Packager. As duas estratégias de criptografia que vamos discutir são chave clara 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, uma é inerentemente menos segura do que a outra devido à forma como as chaves são transmitidas para autenticação e é por isso que um serviço DRM pode fazer mais sentido.

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

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

Limpar criptografia de chaves

Primeiro, você precisa entender o que é e o que não é a chave clara antes de usá-la. Quando você não quer usar um serviço DRM e acha que a criptografia básica da mídia é uma opção viável, use a chave clara. No entanto, lembre-se de que 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, o Clear Key envia o par de chave-valor como texto simples. Portanto, enquanto você estiver criptografando sua mídia, a chave para descriptografá-la não será um segredo.

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 código a seguir cria uma chave de criptografia feita de 16 valores hexadecimais.

openssl rand -hex 16 > media.key

Criar um IV

Em seguida, podemos gerar um vetor de inicialização (IV).

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 flag key, use a chave criada anteriormente, que é armazenada no arquivo media.key. No entanto, ao inserir na linha de comando, remova os espaços em branco. Para a flag 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 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 arquivo media.key ou o IV que você criou anteriormente. 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 Clear Key e quando usá-la. Mas quando você deve usar um serviço de DRM para mais segurança? É aqui que o Widevine ou outro serviço seria usado para criptografar e descriptografar sua mídia com segurança. A Widevine oferece suporte a MPEG-DASH e HLS e é um DRM do Google. O Widevine é usado pelos navegadores da Web Google Chrome e Firefox, Android MediaDRM, Android TV e outros dispositivos de consumo eletrônico que usam extensões de mídia criptografada e extensões de origem de mídia, em que o Widevine descriptografa o conteúdo.

Criptografar com o 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 no comando de desmultiplexação (demux), exceto o nome dos arquivos e a flag --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 Widevine Key Server para conferir mais exemplos.

  1. Separar (separar) o áudio e o vídeo, criptografar os novos arquivos e gerar um arquivo de descrição de apresentação de mídia (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. Reúna (combine) os streams de áudio e vídeo. Se você estiver usando um framework 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 em ordem os comandos necessários para passar de um arquivo .mov bruto para recursos criptografados empacotados para DASH ou HLS. Para ilustrar, vamos converter um arquivo de origem para um bitrate de 8 Mbs em uma resolução de 1080p (1920 x 1080). Ajuste esses valores conforme suas necessidades.

DASH/WebM

  1. Converta o tipo de arquivo e o codec.

    Para esse 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. Separar (separar) o áudio e o vídeo, criptografar os novos arquivos e gerar um arquivo de descrição de apresentação de mídia (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 (combine) os streams de áudio e vídeo. Se você estiver usando um framework 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 chaves claras.

    openssl rand -hex 16 > media.key
    
  3. Separar (separar) o áudio e o vídeo, criptografar os novos arquivos e gerar um arquivo de descrição de apresentação de mídia (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 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 você precisa converter para o contêiner MP4 e 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 chaves claras.

    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
    

Foi muita informação, mas esperamos que agora você consiga criptografar seus arquivos de mídia com confiança. A seguir, vamos mostrar como adicionar mídia ao seu site.