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:
- Shaka Packager (em inglês)
- FFmpeg
- OpenSSL
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.
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"
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
Converta o tipo de arquivo e o codec.
Para esse comando, você pode usar
liborbis
oulibopus
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
Crie uma chave de criptografia de chave clara.
openssl rand -hex 16 > media.key
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
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
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
Crie uma chave de criptografia de chaves claras.
openssl rand -hex 16 > media.key
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
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.
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
Crie uma chave de criptografia de chaves claras.
openssl rand -hex 16 > media.key
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.