Crittografia per contenuti multimediali

Derek Herman
Derek Herman
Mario Medley
Mario Medley

In questa sezione tratteremo due diverse strategie per la crittografia dei contenuti multimediali e alcuni esempi pratici di utilizzo con FFmpeg e Shaka Packager. Le due strategie di crittografia che tratteremo 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 principali servizi DRM 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:

Cancella crittografia chiave

Innanzitutto, devi avere una buona comprensione di cos'è e non usare la chiave prima di utilizzarla. Se non vuoi utilizzare un servizio DRM esistente e ritieni che la crittografia di base dei tuoi contenuti multimediali sia un'opzione attuabile, ti conviene usare Clear Key. Tuttavia, tieni presente che questo tipo di crittografia non fornisce lo stesso livello di sicurezza di uno dei servizi DRM. Questo perché la coppia chiave-valore non è criptata utilizzando un'altra chiave, a differenza delle chiavi criptate che vengono generate da una chiave di decriptazione archiviata su un server di licenze. Inoltre, Clear Key invia la coppia chiave-valore come testo normale, quindi durante la crittografia dei contenuti multimediali, 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. Esegui questa operazione utilizzando OpenSSL. Di seguito verrà creata una chiave di crittografia composta da 16 valori esadecimali.

openssl rand -hex 16 > media.key

Crea un IV

Quindi possiamo generare un vettore di inizializzazione (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Cripta con chiave svuota

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, archiviata nel file media.key. Tuttavia, quando lo inserisci nella 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

Creare un file di informazioni chiave

Per eseguire la crittografia per HLS, oltre a un file della chiave, ti serve un file di informazioni sulla chiave. Un file di informazioni sulle chiavi è un file di testo nel formato seguente. Dovrebbe avere l'estensione .keyinfo. Ad esempio: encrypt.keyinfo.

key URI
key file path
private key

L'URI della chiave è la posizione in cui si troverà media.key (creato in precedenza sul tuo server). Il percorso del file della chiave è la sua posizione rispetto al file di informazioni chiave. Infine, la chiave privata è il contenuto del file media.key o dell'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 accetterà 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 verranno utilizzati 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 è utilizzato dai browser web Google Chrome e Firefox, Android MediaDRM, Android TV e altri dispositivi di elettronica 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 riportati in questo articolo utilizzava la crittografia Clear Key. Tuttavia, per Widevine devi sostituire le opzioni seguenti.

--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), tranne il nome dei file e il flag --content-id, deve essere copiato esattamente dall'esempio. Il campo --content-id è composto da 16 o 32 cifre esadecimali casuali. Utilizza le chiavi qui fornite 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 di descrizione della presentazione multimediale (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"
    
  2. Remux (combina) gli stream audio e video. Se utilizzi un framework video, potrebbe non essere necessario farlo.

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

Sequenza di conversione multimediale

Questa sezione mostra i comandi nell'ordine necessari per trasferire un file .mov non elaborato agli asset criptati pacchettizzati per DASH o HLS. Per avere un'obiettivo esplicativo, stiamo convertendo un file sorgente in una velocità in bit di 8 Mbs 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. Creare 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 di descrizione della presentazione multimediale (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
    
  4. Remux (combina) gli stream audio e video. Se utilizzi un framework video, potrebbe non essere necessario farlo.

    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. Creare 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 di descrizione della presentazione multimediale (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
    
  4. Remux (combina) gli stream audio e video. Se utilizzi un framework video, potrebbe non essere necessario farlo.

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

HLS/MP4

HLS supporta solo MP4, quindi devi prima convertirlo nel container MP4 e nel codec supportato.

  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. Creare una chiave di crittografia Clear Key.

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

Le informazioni da assimilare sono tanti, ma spero che ora sia possibile criptare i contenuti multimediali in tutta sicurezza. Ora ti mostreremo come aggiungere contenuti multimediali al tuo sito.