Enkripsi media

Derek Herman
Derek Herman
Joe Medley
Joe Medley

Di bagian ini, kita akan membahas dua strategi berbeda untuk mengenkripsi media Anda, dan beberapa contoh praktis tentang cara menggunakannya dengan FFmpeg dan Shaka Packager. Dua strategi enkripsi yang akan kita bahas adalah Clear Key dan menggunakan layanan seperti Google Widevine. Kedua strategi tersebut adalah bentuk pengelolaan hak digital (DRM) untuk mengontrol hal yang dapat dilakukan pengguna dengan media Anda. Namun, salah satunya secara inheren kurang aman daripada yang lain karena cara kunci diteruskan untuk autentikasi dan itulah sebabnya layanan DRM mungkin lebih masuk akal.

Layanan DRM utama untuk web adalah Google Widevine, Microsoft PlayReady, dan Apple FairPlay, tetapi kita tidak akan membahas semuanya dalam artikel ini. Namun, jika menargetkan semua browser modern, Anda kemungkinan akan menggunakan ketiga layanan DRM tersebut.

Konversi dan enkripsi dilakukan dengan aplikasi berikut:

Enkripsi Kunci Terbuka

Pertama, Anda harus memiliki pemahaman yang baik tentang apa yang dimaksud dengan Clear Key dan apa yang tidak sebelum menggunakannya. Jika Anda tidak ingin menggunakan layanan DRM yang ada dan merasa enkripsi dasar media Anda adalah opsi yang memungkinkan, Anda akan menggunakan Clear Key. Namun, perlu diingat bahwa jenis enkripsi ini tidak memberikan tingkat keamanan yang sama seperti menggunakan salah satu layanan DRM. Hal ini karena pasangan nilai kunci tidak dienkripsi dengan kunci lain, tidak seperti kunci terenkripsi yang dihasilkan oleh kunci dekripsi yang disimpan di server lisensi. Selain itu, Clear Key mengirim pasangan nilai kunci sebagai teks biasa, sehingga saat Anda mengenkripsi media, kunci untuk mendekodenya bukanlah rahasia.

Buat kunci

Anda dapat menggunakan metode yang sama untuk membuat kunci DASH dan HLS. Lakukan ini menggunakan OpenSSL. Berikut ini akan membuat kunci enkripsi yang terdiri dari 16 nilai heksadesimal.

openssl rand -hex 16 > media.key

Membuat IV

Selanjutnya, kita dapat membuat vektor inisialisasi (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

Mengenkripsi dengan Kunci yang Jelas

Contoh berikut menggunakan Shaka Packager dengan kunci mentah, dengan keys dan key_ids disediakan langsung ke Shaka Packager. Baca dokumentasi untuk mengetahui contoh lainnya.

Untuk flag key, gunakan kunci yang dibuat sebelumnya, yang disimpan dalam file media.key. Namun, saat memasukkannya di command line, pastikan Anda telah menghapus spasi kosongnya. Untuk flag key_id, ulangi nilai media.id atau gunakan nilai IV yang dihasilkan di atas.

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

Membuat file informasi kunci

Untuk mengenkripsi HLS, Anda memerlukan file informasi kunci selain file kunci. File informasi kunci adalah file teks dengan format di bawah. File ini harus memiliki ekstensi .keyinfo. Contoh: encrypt.keyinfo.

key URI
key file path
private key

URI kunci adalah tempat media.key (dibuat di atas) akan berada di server Anda. Jalur file kunci adalah lokasinya yang relatif terhadap file informasi kunci. Terakhir, kunci pribadi adalah isi file media.key itu sendiri, atau IV yang Anda buat sebelumnya. Contoh:

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

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

Perintah ini akan menerima kunci dengan 16 atau 32 karakter.

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

Enkripsi Widevine

Sekarang Anda tahu apa itu enkripsi Clear Key dan kapan harus menggunakannya. Namun, kapan Anda harus menggunakan layanan DRM untuk keamanan tambahan? Di sinilah Widevine, atau layanan lain, akan digunakan untuk mengenkripsi dan mendekripsi media Anda dengan aman. Widevine mendukung MPEG-DASH dan HLS serta merupakan DRM dari Google. Widevine digunakan oleh browser web Google Chrome dan Firefox, Android MediaDRM, Android TV, dan perangkat elektronik konsumen lainnya yang menggunakan Encrypted Media Extensions dan Media Source Extensions, tempat Widevine mendekripsi konten.

Mengenkripsi dengan Widevine

Sebagian besar contoh dalam artikel ini menggunakan enkripsi Clear Key. Namun, untuk Widevine, Anda harus mengganti opsi berikut.

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

Semuanya dalam perintah demultiplekser (demux) kecuali nama file dan tanda --content-id harus disalin persis dari contoh. --content-id adalah 16 atau 32 digit heksadesimal acak. Gunakan kunci yang disediakan di sini, bukan kunci Anda sendiri. Baca dokumentasi Shaka Packager tentang penggunaan Widevine Key Server untuk mengetahui contoh selengkapnya.

  1. Demux (pisahkan) audio dan video, enkripsi file baru, dan hasilkan file media presentation description (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. Menggabungkan (me-remux) streaming audio dan video. Jika menggunakan framework video, Anda mungkin tidak perlu melakukannya.

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

Urutan konversi media

Bagian ini menunjukkan perintah berurutan yang diperlukan untuk beralih dari file .mov mentah ke aset terenkripsi yang dipaketkan untuk DASH atau HLS. Untuk memiliki tujuan yang akan diilustrasikan, kita akan mengonversi file sumber ke kecepatan bit 8 Mbs dengan resolusi 1080p (1920x1080). Sesuaikan nilai ini sesuai kebutuhan Anda.

DASH/WebM

  1. Mengonversi jenis file dan codec.

    Untuk perintah ini, Anda dapat menggunakan liborbis atau libopus untuk 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. Buat kunci enkripsi Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (pisahkan) audio dan video, enkripsi file baru, dan hasilkan file media presentation description (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. Menggabungkan (me-remux) streaming audio dan video. Jika menggunakan framework video, Anda mungkin tidak perlu melakukannya.

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

DASH/MP4

  1. Mengonversi jenis file, codec video, dan kecepatan bit.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. Buat kunci enkripsi Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Demux (pisahkan) audio dan video, enkripsi file baru, dan hasilkan file media presentation description (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. Menggabungkan (me-remux) streaming audio dan video. Jika menggunakan framework video, Anda mungkin tidak perlu melakukannya.

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

HLS/MP4

HLS hanya mendukung MP4, jadi Anda harus mengonversinya terlebih dahulu ke penampung MP4 dan kodekan yang didukung.

  1. Mengonversi jenis file, codec video, dan kecepatan bit.

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. Buat kunci enkripsi Clear Key.

    openssl rand -hex 16 > media.key
    
  3. Membuat file informasi kunci

    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
    

Ada banyak hal yang harus dicerna, tetapi semoga sekarang Anda dapat mengenkripsi media dengan percaya diri. Selanjutnya, kami akan menunjukkan cara menambahkan media ke situs Anda.