Medya şifrelemesi

Deren Herman
Derek Herman
Ali Porsuk
Ali Polat

Bu bölümde, medyanızı şifrelemek için iki farklı stratejiyi ele alacağız. Ayrıca, bunların FFmpeg ve Shaaka Packager ile nasıl kullanılacağına dair bazı pratik örnekler ele alacağız. Burada iki şifreleme stratejisini ele alacağız: Anahtarı Temizleme ve Google Widevine gibi bir hizmet kullanma. Her iki strateji de kullanıcıların medyanızla neler yapabileceğini kontrol etmeye yönelik bir dijital hak yönetimi (DRM) biçimidir. Ancak, bunlardan biri, kimlik doğrulama için anahtarların iletilme şekli nedeniyle diğerinden daha az güvenlidir ve bu nedenle DRM hizmeti daha mantıklı olabilir.

Web için birincil DRM hizmetleri Google Widevine, Microsoft PlayReady ve Apple FairPlay'dir, ancak bu makalede bu hizmetlerin tamamına değinilmeyecektir. Ancak tüm modern tarayıcıları hedefliyorsanız muhtemelen bu üç DRM hizmetini de kullanıyor olacaksınız.

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

Anahtar şifrelemesini temizle

Öncelikle, Temizleme Anahtarı'nı kullanmadan önce 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 seçeneğini kullanabilirsiniz. Ancak bu şifreleme türünün, DRM hizmetlerinden birini kullanmayla aynı düzeyde güvenlik 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 Temizle Anahtarı, anahtar/değer çiftini düz metin olarak gönderir. Böylece medyanızı şifrelerken anahtarın şifresini çözmek bir gizli anahtar değildir.

Anahtar oluştur

DASH ve HLS için anahtar oluşturmak isterseniz aynı yöntemi kullanabilirsiniz. Bunu OpenSSL kullanarak yapın. Aşağıdaki işlem, 16 onaltılık değerden oluşan bir şifreleme anahtarı oluşturacaktır.

openssl rand -hex 16 > media.key

IV oluştur

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

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Açık Anahtarla Şifrele

Aşağıdaki örnekte Ham anahtarlarla Shaka Packager kullanılmıştır. Burada keys ve key_ids, doğrudan Shaka Packager'a sağlanır. Daha fazla örnek için belgeleri okuyun.

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

key URI
key file path
private key

Anahtar URI, media.key (yukarıda oluşturulan öğenin) sunucunuzda bulunduğu 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 dosyasını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 karakterden oluşan anahtarları kabul eder.

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

Widevine şifrelemesi

Artık Açık Anahtar şifrelemesinin ne olduğunu ve ne zaman kullanılacağını biliyorsunuz. Peki, ek güvenlik için ne zaman DRM hizmeti 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'a ait bir DRM'dir. 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ı ve Medya Kaynağı Uzantıları'nı kullanan diğer tüketici elektroniği cihazları tarafından kullanılır.

Widevine ile şifrele

Bu makaledeki örneklerin çoğunda Anahtar şifrelemesini temizle. Ancak, Widevine için aşağıdaki seçenekleri değiştirmek isteyebilirsiniz.

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

Çoklayıcı (demux) komutundaki dosyalarınızın adı ve --content-id işareti hariç her şey tam olarak örnekten kopyalanmalıdır. --content-id, 16 veya 32 rastgele onaltılık basamaktan oluşur. Kendi anahtarlarınız yerine, burada sağlanan anahtarları kullanın. Daha fazla örnek için Widevine Key Server ile ilgili Shaka Packager belgelerini okuyun.

  1. Ses ve görüntüyü ayırın (ayırın), yeni dosyaları şifreleyin ve bir medya sunumu açıklama (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 düzenleme (birleştirme). 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 bir .mov dosyasından DASH veya HLS için paketlenmiş şifrelenmiş öğelere ulaşmak için gereken sıradaki komutlar gösterilmektedir. Açıklamak amacıyla, bir kaynak dosyayı 1080p (1920 x 1080) çözünürlükte 8 Mb/sn'lik bir 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. Temizle anahtarı şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Ses ve görüntüyü ayırın (ayırın), yeni dosyaları şifreleyin ve bir medya sunumu açıklama (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 düzenleme (birleştirme). 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. Temizle anahtarı şifreleme anahtarı oluşturun.

    openssl rand -hex 16 > media.key
    
  3. Ses ve görüntüyü ayırın (ayırın), yeni dosyaları şifreleyin ve bir medya sunumu açıklama (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 düzenleme (birleştirme). 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. Temizle 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
    

Anlaşılması çok fazlaydı ancak artık medya dosyalarınızı güvenle şifreleyebileceğinizi umuyorum. Ardından, sitenize nasıl medya ekleyeceğinizi göstereceğiz.