Criptografia de mídia

Derek herman
Derek Herman
Joe medley
Joe Medley

Nesta seção, vamos abordar 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 abordaremos são Clear Key e usar um serviço como o Google Widevine. Ambas as 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 sua mídia. No entanto, uma é inerentemente menos segura que a outra 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 o Google Widevine, o Microsoft PlayReady e o Apple FairPlay, mas não abordaremos todos eles neste artigo. No entanto, se você quiser segmentar todos os navegadores modernos, provavelmente usará os três serviços de DRM.

A conversão e criptografia é feita com estes aplicativos:

Limpar criptografia de chaves

Primeiro, você deve ter uma boa compreensão do que é e do que não é a Clear Key antes de usá-la. Quando você não quiser usar um serviço de DRM existente e achar que a criptografia básica da mídia é uma opção viável, use a opção 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 em 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 Clear Key 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.

Criar uma chave

É possível usar o mesmo método para criar uma chave para DASH e HLS. Faça isso usando o OpenSSL (link em inglês). O código a seguir criará uma chave de criptografia composta por 16 valores hexadecimais.

openssl rand -hex 16 > media.key

Criar um IV

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

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Criptografar com a tecla Clear Key

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 dele. Para a sinalização key_id, repita o valor media.id ou use o valor 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 importantes

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 importantes é 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) vai ficar localizado no servidor. O caminho do arquivo de chave é a localização dele em relação ao arquivo de informações da chave. Por fim, a chave privada é o conteúdo do próprio arquivo media.key ou do IV que você criou 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 Clear Key e quando usar esse recurso. Mas quando você deve usar um serviço de DRM para segurança adicional? Nesse caso, 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 extensões de mídia criptografada e extensões de origem de mídia, em que o Widevine descriptografa conteúdo.

Criptografar com Widevine

A maioria dos exemplos neste artigo usavam a criptografia Clear Key. No entanto, para o Widevine, convém 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

Todo o conteúdo do comando demultiplexer (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 Widevine Key Server para ver mais exemplos.

  1. Demux (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, 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 seja necessário 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 receber de um arquivo .mov bruto para recursos criptografados empacotados 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 tipo de arquivo e o codec.

    Para este comando, é possível 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 Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (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, 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 seja necessário 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 Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (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, 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 seja necessário 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 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 Clear Key.

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

    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 muita coisa para digerir, mas espero que agora você consiga criptografar sua mídia com confiança. Em seguida, mostraremos como adicionar mídia ao seu site.