Medya şifrelemesi

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Bu bölümde, medyanızı şifrelemek için iki farklı stratejiyi ve bu stratejilerin FFmpeg ve Shaka Packager ile nasıl kullanılacağına dair bazı pratik örnekleri ele alacağız. Ele alacağımız iki şifreleme stratejisi Clear Key ve Google Widevine gibi bir hizmetin kullanılmasıdır. Her iki strateji de kullanıcıların medyanızla neler yapabileceğini kontrol etmek için dijital hak yönetimi (DRM) biçimidir. Ancak, kimlik doğrulama için anahtarların aktarılma şekli nedeniyle bu iki yöntemden biri diğerinden daha az güvenlidir. Bu nedenle, DRM hizmetinin kullanılması daha mantıklı olabilir.

Web için birincil DRM hizmetleri Google Widevine, Microsoft PlayReady ve Apple FairPlay'dir ancak bu makalede bunların tümünü ele almayacağız. Ancak tüm modern tarayıcıları hedefliyorsanız büyük olasılıkla üç DRM hizmetinin de kullanıcılarına reklam göstereceksiniz.

Dönüşüm ve şifreleme aşağıdaki uygulamalarla yapılır:

Açık anahtar şifreleme

Öncelikle, Clear Key'i kullanmadan önce ne olduğunu ve ne olmadığını iyice anlamanız gerekir. Mevcut bir DRM hizmetini kullanmak istemediğinizde ve medyanızın temel şifrelemesinin uygun bir seçenek olduğunu düşünüyorsanız Clear Key'i kullanırsınız. Ancak bu tür şifrelemelerin, DRM hizmetlerinden birini kullanmakla aynı düzeyde güvenlik sağlamadığını unutmayın. Bunun nedeni, anahtar/değer çiftinin, lisans sunucusunda depolanan bir şifre çözme anahtarı tarafından oluşturulan şifrelenmiş anahtarların aksine başka bir anahtarla şifrelenmemesidir. Ayrıca Clear Key, anahtar/değer çiftini düz metin olarak gönderir. Bu nedenle, medyanızı şifrelediğinizde şifresini çözmek için kullanacağınız anahtar gizli değildir.

Anahtar oluştur

Hem DASH hem de HLS için anahtar oluşturmak amacıyla aynı yöntemi kullanabilirsiniz. Bunu OpenSSL'i kullanarak yapabilirsiniz. Aşağıdaki kod, 16 onaltılık değerden oluşan bir şifreleme anahtarı oluşturur.

openssl rand -hex 16 > media.key

IV oluşturma

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

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Açık Anahtarla Şifreleme

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

key işareti için daha önce oluşturulan ve media.key dosyasında depolanan anahtarı kullanın. Ancak komut satırına girerken boşluklarını 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 şifreleme yapmak istiyorsanız anahtar dosyasına ek olarak bir anahtar bilgileri dosyasına da ihtiyacınız vardır. Ana bilgi dosyası, aşağıdaki biçime sahip bir metin dosyasıdır. Dosya uzantısı .keyinfo olmalıdır. Örneğin: encrypt.keyinfo.

key URI
key file path
private key

Anahtar URI'si, media.key'nin (yukarıda oluşturulan) sunucunuzdaki konumudur. Anahtar dosyası yolu, anahtar bilgileri dosyasına göre konumudur. Son olarak, özel anahtar media.key dosyasının içeriği veya daha önce oluşturduğunuz IV'dir. Ö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 şifrelemenin ne olduğunu ve ne zaman kullanılacağını biliyorsunuz. Ancak ek güvenlik için DRM hizmetini ne zaman kullanmalısınız? Bu noktada Widevine veya başka bir hizmet, medyanızı güvenli bir şekilde şifrelemek ve şifresini çözmek için kullanılır. Google'ın DRM'si olan Widevine, MPEG-DASH ve HLS'yi destekler. Widevine, Google Chrome ve Firefox web tarayıcıları, Android MediaDRM, Android TV ve Widevine'in içeriğin şifresini çözdüğü Şifrelenmiş Medya Uzantıları ile 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 Açık Anahtar şifrelemesi 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 dışındaki tüm içerikler, çoklu oynatıcı (demux) komutunda tam olarak örnekten kopyalanmalıdır. --content-id, 16 veya 32 rastgele on altılık basamaktır. Kendi anahtarlarınız yerine burada sağlanan anahtarları kullanın. Daha fazla örnek için Widevine Key Server'ı kullanmayla ilgili Shaka Packager belgelerini inceleyin.

  1. Ses ve videoyu ayırın (demux), yeni dosyaları şifreleyin ve bir medya sunumu açıklaması (MPD) dosyası oluşturun.

    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ı yeniden bir araya getirin (birleştirin). 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üştürme sırası

Bu bölümde, ham .mov dosyasından DASH veya HLS için paketlenmiş şifrelenmiş öğelere geçmek için gereken komutlar sırayla gösterilmektedir. Bir hedef göstermek amacıyla, bir kaynak dosyayı 1080p (1920 x 1080) çözünürlükte 8 Mb/sn 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 komut için ses codec'i olarak 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. Açık anahtar şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Ses ve videoyu ayırın (demux), yeni dosyaları şifreleyin ve bir medya sunumu açıklaması (MPD) dosyası oluşturun.

    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ı yeniden bir araya getirin (birleştirin). 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. Açık anahtar şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Ses ve videoyu ayırın (demux), yeni dosyaları şifreleyin ve bir medya sunumu açıklaması (MPD) dosyası oluşturun.

    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ı yeniden bir araya getirin (birleştirin). 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 kapsayıcısı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. Açık 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 konuyu anlamak için çok fazla bilgi verdiğimizden eminiz. Ancak artık medya dosyalarınızı güvenle şifreleyebildiğinizi umuyoruz. Ardından, sitenize nasıl medya ekleyeceğinizi göstereceğiz.