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:
- Shaka Packager (em inglês)
- FFmpeg
- OpenSSL
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.
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"
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
Converta o codec e o tipo de arquivo.
Para este 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
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
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
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 chave clara.
openssl rand -hex 16 > media.key
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
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.
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 chave clara.
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
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.