Crittografia per contenuti multimediali

Derek Herman
Derek Herman
Joe Medley
Joe Medley

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.

  1. 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"
    
  2. 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

  1. Converti il tipo di file e il codec.

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

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

  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) 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
    
  4. 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.

  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
    

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.