Medya şifrelemesi

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Bu bölümde, medyanızı şifrelemeye yönelik iki farklı stratejiden bahsedeceğiz. Ayrıca bunların FFmpeg ve Shaka Packager ile nasıl kullanılabileceğine dair pratik örneklere yer vereceğiz. Şifrelemeyle ilgili iki strateji, Anahtarı Temizle ve Google Widevine gibi bir hizmet kullanmaktır. Her iki strateji de kullanıcıların medyanızla ne yapabileceğini kontrol etmeye yarayan bir dijital hak yönetimi (DRM) biçimidir. Ancak bunlardan biri, kimlik doğrulama için anahtarların aktarılma yöntemi nedeniyle yapısı gereği diğerinden daha az güvenlidir. Bu nedenle DRM hizmeti daha mantıklı olabilir.

Web'deki birincil DRM hizmetleri Google Widevine, Microsoft PlayReady ve Apple FairPlay'dir, ancak bu makalede bunların hepsini ele almayacağız. Bununla birlikte, tüm modern tarayıcıları hedefliyorsanız muhtemelen üç DRM hizmetini de kullanıyor olmalısınız.

Dönüştürme ve şifreleme işlemi şu uygulamalarda yapılır:

Anahtar şifrelemeyi temizle

Öncelikle, anahtarı kullanmadan önce anahtarın ne olduğunu ve olmadığını iyice anlamış olmanız gerekir. Mevcut bir DRM hizmetini kullanmak istemiyorsanız ve medyanızın temel şifrelemesinin uygun bir seçenek olduğunu düşünüyorsanız Anahtarı Temizle işlevini kullanırsınız. Ancak bu şifreleme türünün, DRM hizmetlerinden birinin kullanımıyla aynı güvenlik düzeyini sağlamadığını unutmayın. Bunun nedeni, lisans sunucusunda depolanan bir şifre çözme anahtarı tarafından oluşturulan şifrelenmiş anahtarların aksine, anahtar/değer çiftinin başka bir anahtar altında şifrelenmemesidir. Ayrıca, Anahtarı Temizle, anahtar/değer çiftini düz metin olarak gönderir. Böylece, medyanızı şifrelerken şifrenin çözülmesini sağlayacak anahtar bir gizli anahtar değildir.

Anahtar oluştur

Hem DASH hem HLS için anahtar oluşturmak üzere aynı yöntemi kullanabilirsiniz. Bunu OpenSSL kullanarak yapın. Aşağıda, 16 onaltılık değerden oluşan bir şifreleme anahtarı oluşturulur.

openssl rand -hex 16 > media.key

IV oluşturun

Ardından bir başlatma vektörü (IV) oluşturabiliriz.

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Anahtarı Temizle ile Şifreleme

Aşağıdaki örnekte ham anahtarlarla Shaka Packager kullanılmaktadır. keys ve key_ids, doğrudan Shaka Packager'a sağlanır. Daha fazla örnek için dokümanları okuyun.

key işareti için media.key dosyasında depolanan, daha önce oluşturulan anahtarı kullanın. Ancak, kodu komut satırına girerken, boşlukları kaldırdığınızdan emin olun. key_id işareti için media.id değerini tekrarlayın veya yukarıda oluşturulan IV değerini kullanın.

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

Önemli bilgiler dosyası oluşturma

HLS için şifrelemek istiyorsanız anahtar dosyasına ek olarak bir anahtar bilgi dosyasına da ihtiyacınız vardır. Anahtar bilgileri dosyası, aşağıdaki biçime sahip bir metin dosyasıdır. .keyinfo uzantısına sahip olmalıdır. Örnek: encrypt.keyinfo.

key URI
key file path
private key

Anahtar URI, media.key öğesinin (yukarıda oluşturulan) sunucunuzda bulunacağı yerdir. Anahtar dosyası yolu, dosyanın anahtar bilgi dosyasına göre konumudur. Son olarak, özel anahtar, media.key dosyasının veya daha önce oluşturduğunuz IV'ün içeriğidir. Örneğin:

https://example.com/keys/media.key
/path/to/media.key
6143b5373a51cb46209cfed0d747da66

HLS için şifreleme

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/"

Bu komut, 16 veya 32 karakterli bir anahtarı kabul eder.

ffmpeg -i myvideo.mov -c:v libx264 -c:a aac -hls_key_info_file encrypt.keyinfo myvideo.m3u8

Widevine şifrelemesi

Artık Net Anahtar şifrelemesinin ne olduğunu ve ne zaman kullanılacağını biliyorsunuz. Peki, ek güvenlik için ne zaman DRM hizmetini kullanmalısınız? Bu noktada medyanızı güvenli bir şekilde şifrelemek ve şifresini çözmek için Widevine veya başka bir hizmet kullanılır. Widevine, MPEG-DASH ve HLS'yi destekler ve Google tarafından sunulan bir DRM'dir. Widevine; Google Chrome ve Firefox web tarayıcıları, Android MediaDRM, Android TV ve Widevine'ın içeriğin şifresini çözdüğü Şifrelenmiş Medya Uzantıları ve Medya Kaynağı Uzantıları kullanan diğer tüketici elektroniği cihazları tarafından kullanılır.

Widevine ile şifreleme

Bu makaledeki örneklerin çoğunda Anahtar Şifrelemeyi Temizle kullanılmıştır. Ancak Widevine için aşağıdaki seçenekleri değiştirmeniz gerekir.

--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE

Dosyalarınızın adı ve --content-id işareti hariç de Multiplexer (demux) komutundaki her şey örnekten kopyalanmalıdır. --content-id, 16 veya 32 rastgele onaltılık basamaktan oluşur. Kendi anahtarları yerine burada sağlanan anahtarları kullanın. Daha fazla örnek için Widevine Anahtar Sunucusu'nu kullanma hakkındaki Shaka Paketleyici dokümanlarını okuyun.

  1. Ses ve video için Demux (ayrı) yapın, yeni dosyaları şifreleyin ve bir medya sunumu açıklaması (MPD) dosyası çıkarın.

    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. Ses ve video akışlarını Remux (bir araya getirir). Video çerçevesi kullanıyorsanız bunu yapmanız gerekmeyebilir.

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

Medya dönüşüm dizisi

Bu bölümde, ham .mov dosyasından DASH veya HLS için paketlenmiş şifrelenmiş öğelere ulaşmak için gereken sıra komutları gösterilmektedir. Örnek olarak göstereceğimiz bir hedef için, bir kaynak dosyayı 1080p (1920 x 1080) çözünürlükte 8 Mbs bit hızına dönüştürüyoruz. Bu değerleri ihtiyaçlarınıza göre ayarlayın.

DASH/WebM

  1. Dosya türünü ve codec'i dönüştürün.

    Bu komutta, ses codec'i için liborbis veya libopus kullanabilirsiniz.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. Net bir anahtar şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Ses ve video için Demux (ayrı) yapın, yeni dosyaları şifreleyin ve bir medya sunumu açıklaması (MPD) dosyası çıkarın.

    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. Ses ve video akışlarını Remux (bir araya getirir). Video çerçevesi kullanıyorsanız bunu yapmanız gerekmeyebilir.

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

DASH/MP4

  1. Dosya türünü, video codec'ini ve bit hızını dönüştürün.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Net bir anahtar şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Ses ve video için Demux (ayrı) yapın, yeni dosyaları şifreleyin ve bir medya sunumu açıklaması (MPD) dosyası çıkarın.

    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. Ses ve video akışlarını Remux (bir araya getirir). Video çerçevesi kullanıyorsanız bunu yapmanız gerekmeyebilir.

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

HLS/MP4

HLS yalnızca MP4'ü destekler. Bu nedenle, önce MP4 container'ına ve desteklenen codec'lere dönüştürmeniz gerekir.

  1. Dosya türünü, video codec'ini ve bit hızını dönüştürün.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Net bir anahtar şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Önemli bilgiler dosyası oluşturma

    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
    

Bu çok fazla özetti, ancak umarım artık medya içeriklerinizi güvenle şifreleyebilirsiniz. Ardından, sitenize nasıl medya ekleyeceğinizi göstereceğiz.