Criptografia de mídia

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Nesta seção, vamos abordar duas estratégias diferentes de criptografia sua mídia e alguns exemplos práticos sobre como usá-los com o FFmpeg e Shaka Packager. As duas estratégias de criptografia que vamos discutir são Clear Key e usando um serviço como o Google Widevine. As duas estratégias são uma forma gerenciamento de direitos autorais (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 à forma como as chaves são transmitidas 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 o Apple FairPlay, mas não vamos abordar todos eles neste artigo. No entanto, se você segmentar todos os navegadores modernos, provavelmente usará 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ê deve ter uma boa compreensão do que é e não é usá-lo. Quando você não quiser usar um serviço DRM existente e sentir a criptografia básica da sua mídia é uma opção viável. Para isso, use a chave Limpar. Porém, lembre-se de que esse tipo de criptografia não fornece o mesmo nível de e segurança quanto ao uso de um dos serviços de DRM. Isso ocorre porque o par de chave-valor é não criptografadas por 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 função Limpar chave envia par de valores-chave como texto simples. Enquanto você criptografa a mídia, a chave descriptografá-lo 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 OpenSSL (link em inglês). 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 mais exemplos.

Para a sinalização key, use a chave criada anteriormente, que está armazenada em 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 IV. geradas 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 O arquivo de informações de chave é um arquivo de texto com o formato abaixo. Ele deve ter 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 é o local dele em relação à chave. arquivo de informações. Por fim, a chave privada é o conteúdo do arquivo media.key ou o 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 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, que serão usados para criptografar e descriptografar sua mídia com segurança. O Widevine oferece suporte a MPEG-DASH e HLS e é um DRM do Google. Widevine é usado pelo Google Chrome e Firefox navegadores, Android MediaDRM, Android TV e outros dispositivos eletrônicos de consumo que usam Encrypted Media Extensions e Media Source Extensions, em que o Widevine descriptografa o conteúdo.

Criptografar com Widevine

A maioria dos exemplos neste artigo usou a criptografia Clear Key. No entanto, para Widevine, substitua 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 estiver no comando demultiplexador (demux), exceto o nome de seus arquivos e o A flag --content-id precisa ser copiada exatamente do exemplo. A --content-id tem 16 anos ou 32 dígitos hexadecimais aleatórios. Use as chaves fornecidas aqui em vez das suas. Leia o Shaka Documentação do Packager sobre o uso do servidor de chaves Wivine (link em inglês) para mais exemplos.

  1. Demux (separe) o áudio e o vídeo, criptografe os novos arquivos e gere uma saída 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 um vídeo talvez você 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 de recursos criptografados em pacotes para DASH ou HLS. Para ter o objetivo de estamos convertendo um arquivo de origem para uma taxa de bits de 8Mbs a uma resolução de 1080p (1.920 x 1.080). Ajuste esses valores conforme suas necessidades.

DASH/WebM

  1. Converta o codec e o tipo de arquivo.

    Para este comando, use 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, criptografe os novos arquivos e gere uma saída 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 um vídeo talvez você 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, criptografe os novos arquivos e gere uma saída 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 um vídeo talvez você não precise fazer isso.

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

HLS/MP4

HLS só oferece suporte a MP4, então primeiro é preciso 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 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.