تشفير الوسائط

ديريك هيرمان
ديريك هيرمان
جو ميدلي
جو ميدلي

سوف نتناول في هذا القسم استراتيجيتين مختلفتين لتشفير الوسائط، وبعض الأمثلة العملية حول كيفية استخدامهما مع أداة FFmpeg وShaka Packager. الاستراتيجيتان للتشفير اللذين سنناقشهما هما Clear Key واستخدام خدمة مثل Google Widevine تُعدّ كلتا الاستراتيجيتين شكلاً من أشكال إدارة الحقوق الرقمية (DRM) للتحكّم في ما يمكن للمستخدمين فعله باستخدام الوسائط الخاصة بك. إلا أن أحدهما أقل أمانًا بطبيعتها من الآخر بسبب طريقة تمرير المفاتيح للمصادقة وهذا هو السبب في أن خدمة إدارة الحقوق الرقمية قد تكون أكثر منطقية.

إنّ خدمات إدارة الحقوق الرقمية الأساسية للويب هي Google Widevine وMicrosoft Play أجريتها وApple FairPlay، ولكننا لن نتناولها كلها في هذه المقالة. ومع ذلك، إذا كنت تستهدف جميع المتصفحات الحديثة، فمن المحتمل أنك ستستخدم خدمات إدارة الحقوق الرقمية الثلاث جميعها.

ويتم التحويل والتشفير باستخدام التطبيقات التالية:

محو تشفير المفتاح

أولاً، يجب أن يكون لديك فهم جيد لماهية المفتاح الواضح وما لا يكون عليه قبل استخدامه. إذا كنت لا ترغب في استخدام إحدى خدمات إدارة الحقوق الرقمية الحالية وتشعر أنّ التشفير الأساسي للوسائط هو خيار قابل للتطبيق، يمكنك استخدام أداة "محو المفاتيح". ولكن ضع في اعتبارك أن هذا النوع من التشفير لا يوفر مستوى الأمان نفسه الذي لا يوفره استخدام إحدى خدمات إدارة الحقوق الرقمية. ويرجع ذلك إلى أنّ زوج قيمة المفتاح لا يتم تشفيره ضمن مفتاح آخر، على عكس المفاتيح المشفرة التي يتم إنشاؤها بواسطة مفتاح فك التشفير المُخزَّن على خادم ترخيص. بالإضافة إلى ذلك، يرسل Click Key زوج قيمة المفتاح كنص عادي، لذا أثناء تشفير الوسائط الخاصة بك، لا يكون المفتاح لفك تشفيرها سرًا.

إنشاء مفتاح

يمكنك استخدام نفس الطريقة لإنشاء مفتاح لكل من DASH وHLS. ويمكنك إجراء ذلك باستخدام OpenSSL. في ما يلي إنشاء مفتاح تشفير مكوّن من 16 قيمة سداسية عشرية.

openssl rand -hex 16 > media.key

إنشاء IV

بعد ذلك يمكننا إنشاء متجه تهيئة (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

التشفير باستخدام مفتاح الواضح

يستخدم المثال التالي Shaka Packager مع مفاتيح أساسية، حيث يتم توفير keys وkey_ids إلى Shaka Packager مباشرةً. اقرأ الوثائق للحصول على مزيد من الأمثلة.

في علامة key، استخدِم المفتاح الذي تم إنشاؤه مسبقًا، والذي يتم تخزينه في ملف media.key. ومع ذلك، عند إدخاله في سطر الأوامر، تأكد من إزالة المسافة البيضاء. بالنسبة إلى العلامة key_id، كرِّر القيمة media.id أو استخدِم القيمة IV التي تم إنشاؤها أعلاه.

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

إنشاء ملف معلومات أساسي

لتشفير بروتوكول HLS، تحتاج إلى ملف معلومات مفتاح بالإضافة إلى ملف مفتاح. ملف المعلومات الرئيسية هو ملف نصي بالتنسيق أدناه. يجب أن تتضمن الإضافة .keyinfo. مثلاً: encrypt.keyinfo

key URI
key file path
private key

معرّف الموارد المنتظم (URI) للمفتاح هو المكان الذي سيتم فيه تحديد موقع media.key (الذي تم إنشاؤه أعلاه) على خادمك. مسار ملف المفتاح هو موقعه بالنسبة إلى ملف المعلومات الأساسي. أخيرًا، المفتاح الخاص هو محتوى ملف media.key نفسه أو ملف IV الذي أنشأته من قبل. مثال:

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

تشفير المحتوى وفق بروتوكول 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/"

سيقبل هذا الأمر مفتاحًا يحتوي على 16 أو 32 حرفًا.

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

تشفير Widevine

الآن أنت تعرف ما هو تشفير المفتاح "Clear Key" ومتى تستخدمه. ولكن متى يجب استخدام خدمة إدارة الحقوق الرقمية للحصول على مزيد من الأمان؟ وهذا هو المكان الذي سيتم فيه استخدام Widevine أو أي خدمة أخرى لتشفير الوسائط وفك تشفيرها بأمان. يتوافق نطاق Widevine مع MPEG-DASH وHLS وبرنامج DRM من Google. يتم استخدام Widevine في متصفّحات الويب Google Chrome وFirefox وAndroid MediaDRM وAndroid TV والأجهزة الإلكترونية الاستهلاكية الأخرى التي تستخدم إضافات الوسائط المشفرة وإضافات مصادر الوسائط، حيث تفكّ منصة Widevine فك تشفير المحتوى.

التشفير باستخدام Widevine

استخدمت معظم الأمثلة في هذه المقالة تشفير المفتاح الواضح. ومع ذلك، بالنسبة إلى Widevine، ستحتاج إلى استبدال الخيارات التالية.

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

يجب نسخ كل شيء في الأمر deMultiplexer (demux) باستثناء اسم ملفاتك والعلامة --content-id تمامًا من المثال. يتكوَّن --content-id من 16 أو 32 رقمًا سداسيًا عشريًا عشوائيًا. استخدِم المفاتيح المقدَّمة هنا بدلاً من المفاتيح الخاصة بك. اقرأ وثائق Shaka Packager حول استخدام خادم Widevine Key Server للحصول على مزيد من الأمثلة.

  1. اقطع الصوت والفيديو (بشكل منفصل) وشفِّر الملفات الجديدة وأخرج ملف وصف عرض الوسائط (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. مزج (دمج) الصوت والفيديو مع البث المباشر إذا كنت تستخدم إطارًا للفيديو، فقد لا تحتاج إلى القيام بذلك.

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

تسلسل الإحالات الناجحة للوسائط

يُظهر هذا القسم الأوامر المطلوبة للانتقال من ملف .mov أولي إلى مواد عرض مشفّرة تم تعبئتها باستخدام DASH أو HLS. بهدف توضيح المحتوى، نعمل على تحويل ملف مصدر إلى معدل نقل بيانات يبلغ 8 ميغابايت ودرجة دقة 1080p (1920 × 1080). يمكنك تعديل هذه القيم وفقًا لاحتياجاتك.

بروتوكول DASH أو WebM

  1. تحويل نوع الملف وبرنامج الترميز

    لتنفيذ هذا الأمر، يمكنك استخدام liborbis أو libopus لبرنامج ترميز الصوت.

    ffmpeg -i glocken.mov -c:v libvpx-vp9 -c:a libvorbis -b:v 8M -vf setsar=1:1 -f webm tmp_glocken.webm
    
  2. أنشئ مفتاح تشفير "محو مفتاح".

    openssl rand -hex 16 > media.key
    
  3. اقطع الصوت والفيديو (بشكل منفصل) وشفِّر الملفات الجديدة وأخرج ملف وصف عرض الوسائط (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. مزج (دمج) الصوت والفيديو مع البث المباشر إذا كنت تستخدم إطارًا للفيديو، فقد لا تحتاج إلى القيام بذلك.

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

DASH/MP4

  1. تحويل نوع الملف وبرنامج ترميز الفيديو ومعدل نقل البيانات

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
    
  2. أنشئ مفتاح تشفير "محو مفتاح".

    openssl rand -hex 16 > media.key
    
  3. اقطع الصوت والفيديو (بشكل منفصل) وشفِّر الملفات الجديدة وأخرج ملف وصف عرض الوسائط (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. مزج (دمج) الصوت والفيديو مع البث المباشر إذا كنت تستخدم إطارًا للفيديو، فقد لا تحتاج إلى القيام بذلك.

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

بروتوكول HLS/MP4

لا يدعم HLS سوى تنسيق MP4، لذا يجب أولاً التحويل إلى حاوية MP4 وبرامج الترميز المتوافقة.

  1. تحويل نوع الملف وبرنامج ترميز الفيديو ومعدل نقل البيانات

    ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
    
  2. أنشئ مفتاح تشفير "محو مفتاح".

    openssl rand -hex 16 > media.key
    
  3. إنشاء ملف معلومات رئيسي

    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
    

لقد فهمت ذلك كثيرًا، ولكن نأمل أن تتمكن الآن من تشفير الوسائط بثقة. بعد ذلك، سنوضّح لك كيفية إضافة وسائط إلى موقعك الإلكتروني.