Crittografia per contenuti multimediali

Derek Herman
Derek Herman
Joe Medley
Joe Medley

In questa sezione illustreremo due diverse strategie per criptare i contenuti multimediali e alcuni esempi pratici su come utilizzarle con FFmpeg e Shaka Packager. Le due strategie di crittografia che esamineremo 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 cosa possono fare gli utenti con i tuoi contenuti multimediali. Tuttavia, uno è intrinsecamente meno sicuro dell'altro a causa del modo in cui le chiavi vengono trasmesse 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, probabilmente utilizzerai tutti e tre i servizi DRM.

La conversione e la crittografia vengono eseguite con le seguenti applicazioni:

Crittografia Clear Key

Innanzitutto, devi avere una buona conoscenza di cosa è e cosa non è Clear Key prima di usarlo. Se non vuoi utilizzare un servizio DRM esistente e ritieni che la crittografia di base dei tuoi contenuti multimediali sia un'opzione praticabile, puoi utilizzare Clear Key. Tuttavia, tieni presente che questo tipo di crittografia non offre lo stesso livello di sicurezza dell'utilizzo di uno dei servizi DRM. Questo perché la coppia chiave/valore non è criptata con un'altra chiave, a differenza delle chiavi criptate che vengono generate da una chiave di decrittografia archiviata su un server delle licenze. Inoltre, Clear Key invia la coppia chiave-valore in testo normale, quindi durante la crittografia dei contenuti multimediali la chiave per decriptarli non è segreta.

Crea una chiave

Puoi utilizzare lo stesso metodo per creare una chiave sia per DASH che per HLS. Per farlo, utilizza OpenSSL. Di seguito viene creata una chiave di crittografia composta da 16 valori esadecimali.

openssl rand -hex 16 > media.key

Creare un IV

Successivamente, possiamo generare un vettore di inizializzazione (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Crittografia con chiave chiara

L'esempio seguente utilizza Shaka Packager con chiavi non elaborate, in cui 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 è memorizzata nel file media.key. Tuttavia, quando lo inserisci nella riga di comando, assicurati di aver rimosso gli spazi. 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 la crittografia per HLS, oltre a un file della chiave, è necessario un file di informazioni sulla chiave. Un file di informazioni chiave è un file di testo con il formato riportato di seguito. Deve avere l'estensione .keyinfo. Ad esempio: encrypt.keyinfo.

key URI
key file path
private key

L'URI della chiave è la posizione in cui si trova media.key (creato sopra) sul tuo server. Il percorso del file della chiave è la sua posizione rispetto al file di informazioni sulla chiave. Infine, la chiave privata è costituita dai contenuti del media.key file stesso o dall'IV che hai 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 con 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 dovresti utilizzare un servizio DRM per una maggiore sicurezza? È qui che viene utilizzato Widevine o un altro servizio 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 altri dispositivi di elettronica di consumo che utilizzano le estensioni Encrypted Media e Media Source, in cui Widevine decripta i contenuti.

Crittografia con Widevine

La maggior parte degli esempi in questo articolo ha utilizzato la crittografia Clear Key. Tuttavia, per Widevine dovresti 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 nel comando demultiplexer (demux), tranne il nome dei file e il flag --content-id, deve essere copiato esattamente dall'esempio. --content-id è costituito da 16 o 32 cifre esadecimali casuali. Utilizza le chiavi fornite qui anziché le tue. Per ulteriori esempi, leggi la documentazione di Shaka Packager sull'utilizzo di Widevine Key Server.

  1. Demux (separa) l'audio e il video, cripta i nuovi file e genera un file MPD (Media Presentation 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"
    
  2. Remux (combina) gli stream audio e video. Se utilizzi un framework per i video, potresti non dover eseguire questa operazione.

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

Sequenza di conversione dei contenuti multimediali

Questa sezione mostra in ordine i comandi necessari per passare da un file .mov non elaborato agli asset criptati pacchettizzati per DASH o HLS. Per avere un obiettivo da illustrare, stiamo convertendo un file sorgente a una velocità in bit di 8 Mb/s a una risoluzione di 1080p (1920 x 1080). Modifica questi valori in base alle tue esigenze.

DASH/WebM

  1. Converti il tipo di file e il codec.

    Per questo comando puoi utilizzare liborbis o libopus per il 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
    
  2. Crea una chiave di crittografia Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (separa) l'audio e il video, cripta i nuovi file e genera un file MPD (Media Presentation 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
    
  4. Remux (combina) gli stream audio e video. Se utilizzi un framework per i video, potresti non dover eseguire questa operazione.

    ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
    

DASH/MP4

  1. 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
    
  2. Crea una chiave di crittografia Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (separa) l'audio e il video, cripta i nuovi file e genera un file MPD (Media Presentation 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
    
  4. Remux (combina) gli stream audio e video. Se utilizzi un framework per i video, potresti non dover eseguire questa operazione.

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

HLS/MP4

HLS supporta solo MP4, quindi devi prima convertire il contenitore in MP4 e i codec supportati.

  1. 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
    
  2. Crea una chiave di crittografia Clear Key.

    openssl rand -hex 16 > media.key
    
  3. 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
    

È stato molto da assimilare, ma ora spero che tu sia in grado di criptare i tuoi contenuti multimediali in tutta sicurezza. Ora ti mostreremo come aggiungere contenuti multimediali al tuo sito.