In questa sezione tratteremo due diverse strategie per la crittografia dei contenuti multimediali e alcuni esempi pratici su come utilizzarle con FFmpeg e Shaaka Packager. Le due strategie per la crittografia di cui parleremo sono Clear Key e l'utilizzo di un servizio come Google Widevine. Entrambe le strategie sono una forma di gestione dei diritti digitali (DRM) per controllare ciò che gli utenti possono fare con i tuoi contenuti multimediali. Tuttavia, uno è intrinsecamente meno sicuro dell'altro a causa del modo in cui le chiavi vengono passate per l'autenticazione ed è per questo che un servizio DRM potrebbe avere più senso.
I servizi DRM principali per il web sono Google Widevine, Microsoft PlayReady e Apple FairPlay, ma non li tratteremo tutti in questo articolo. Tuttavia, se scegli come target tutti i browser moderni, è probabile che utilizzerai tutti e tre i servizi DRM.
La conversione e la crittografia vengono eseguite con queste applicazioni:
Cancella crittografia chiave
Innanzitutto, dovresti aver compreso a fondo cosa sia Clear Key e cosa no prima di utilizzarlo. Se non vuoi utilizzare un servizio DRM esistente e ritieni che la crittografia di base dei tuoi contenuti multimediali sia un'opzione attuabile, dovresti usare Clear Key. Tuttavia, tieni presente che questo tipo di crittografia non fornisce lo stesso livello di sicurezza di un utilizzo di uno dei servizi DRM. Questo perché la coppia chiave-valore non è criptata in un'altra chiave, a differenza delle chiavi criptate generate da una chiave di decrittografia archiviata su un server di licenze. Inoltre, Clear Key invia la coppia chiave-valore come testo normale, quindi, mentre cripti il contenuto multimediale, la chiave per decriptarla non è un secret.
Crea una chiave
Puoi utilizzare lo stesso metodo per creare una chiave sia per DASH che per HLS. Per farlo, utilizza OpenSSL. Di seguito verrà creata una chiave di crittografia composta da 16 valori esadecimali.
openssl rand -hex 16 > media.key
Crea un IV
Ora possiamo generare un vettore di inizializzazione (IV).
openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66
Cripta con Cancella chiave
L'esempio seguente utilizza Shaka Packager con chiavi non elaborate, dove keys
e
key_ids
vengono forniti direttamente a Shaka Packager. Leggi la documentazione per
altri esempi.
Per il flag key
, utilizza la chiave creata in precedenza, che è archiviata nel file media.key
. Tuttavia, quando lo inserisci dalla riga di comando, assicurati di aver rimosso
lo spazio vuoto. Per il flag key_id
, ripeti il valore media.id
o utilizza il valore IV
generato sopra.
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
Crea un file di informazioni chiave
Per criptare gli oggetti HLS, hai bisogno di un file con le informazioni sulle chiavi oltre a un file della chiave. Un
file di informazioni chiave è un file di testo nel formato riportato di seguito. Dovrebbe avere l'estensione .keyinfo
. Ad esempio: encrypt.keyinfo
.
key URI
key file path
private key
L'URI della chiave è il punto in cui si troverà il media.key
(creato sopra) sul tuo server. Il percorso del file di chiave è la sua posizione rispetto al file
di informazioni chiave. Infine, la chiave privata corrisponde ai contenuti del file media.key
stesso, o IV, creato in precedenza. Ad esempio:
https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66
Crittografia per 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/"
Questo comando accetta una chiave di 16 o 32 caratteri.
ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8
Crittografia Widevine
Ora sai cos'è la crittografia Clear Key e quando utilizzarla. Ma quando è consigliabile utilizzare un servizio DRM per una maggiore sicurezza? È qui che Widevine, o un altro servizio, viene utilizzato per criptare e decriptare in modo sicuro i tuoi contenuti multimediali. Widevine supporta MPEG-DASH e HLS ed è un DRM di Google. Widevine viene utilizzato dai browser web Google Chrome e Firefox, da Android MediaDRM, Android TV e da altri dispositivi elettronici di consumo che utilizzano Encrypted Media Extensions e Media Source Extensions, in cui Widevine decripta i contenuti.
Cripta con Widevine
La maggior parte degli esempi in questo articolo utilizzava la crittografia Clear Key. Tuttavia, per Widevine dovrai sostituire le seguenti opzioni.
--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
Tutto ciò che è presente nel comando demultiplexer (demux), ad eccezione del nome dei file e del
flag --content-id
, deve essere copiato esattamente dall'esempio. Il --content-id
è composto da 16
o 32 cifre esadecimali casuali. Utilizza le chiavi fornite qui anziché le tue. Per altri esempi, consulta la documentazione di Shaka Packager sull'utilizzo di Widevine Key Server.
Demux (separa) audio e video, cripta i nuovi file e genera un file MPD (Media Presenta Description).
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 (combinare) gli stream audio e video. Se utilizzi un framework per un video, potrebbe non essere necessario.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
Sequenza di conversione multimediale
Questa sezione mostra i comandi ordinati per passare da un file .mov
non elaborato agli asset criptati, pacchettizzati per DASH o HLS. Per avere un obiettivo preciso, stiamo convertendo un file sorgente a una velocità in bit di 8 Mbs e a una risoluzione di 1080p (1920 x 1080). Modifica questi valori in base alle tue esigenze.
DASH/WebM
Converti il tipo di file e il codec.
Per questo comando puoi utilizzare
liborbis
olibopus
come codec audio.ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
Crea una chiave di crittografia Clear Key.
openssl rand -hex 16 > media.key
Demux (separa) audio e video, cripta i nuovi file e genera un file MPD (Media Presenta Description).
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 (combinare) gli stream audio e video. Se utilizzi un framework per un video, potrebbe non essere necessario.
ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
DASH/MP4
Converti il tipo di file, il codec video e la velocità in bit.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
Crea una chiave di crittografia Clear Key.
openssl rand -hex 16 > media.key
Demux (separa) audio e video, cripta i nuovi file e genera un file MPD (Media Presenta Description).
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 (combinare) gli stream audio e video. Se utilizzi un framework per un video, potrebbe non essere necessario.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
HLS/MP4
HLS supporta solo MP4, quindi dovrai prima convertirlo nel container MP4 e i codec supportati.
Converti il tipo di file, il codec video e la velocità in bit.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
Crea una chiave di crittografia Clear Key.
openssl rand -hex 16 > media.key
Crea un file di informazioni chiave
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
I dati erano tanti, ma spero che ora tu sia in grado di criptare i tuoi contenuti multimediali con sicurezza. Ora ti mostreremo come aggiungere contenuti multimediali al sito.