הצפנת מדיה

Derek Herman
Derek Herman
Joe Medley
Joe Medley

בחלק הזה נעסוק בשתי אסטרטגיות שונות להצפנת מדיה, ונספק כמה דוגמאות מעשיות לשימוש בהן עם FFmpeg ו-Shaka Packager. שתי האסטרטגיות להצפנה שנדון בהן הן נקה מפתח, ושימוש בשירות כמו Google Widevine. שתי האסטרטגיות הן סוג של ניהול זכויות דיגיטליות (DRM) שמטרתו לקבוע מה המשתמשים יכולים לעשות עם המדיה שלכם. עם זאת, מטבען, אחד מהם פחות בטוח מהשני בגלל הדרך שבה מפתחות מועברים לצורך אימות, ולכן שירות DRM עשוי להיות הגיוני יותר.

שירותי ה-DRM העיקריים באינטרנט הם Google Widevine, Microsoft PlayReady ו-Apple FairPlay, אבל לא נעסוק בכולם במאמר הזה. עם זאת, אם תטרגטו את כל הדפדפנים המתקדמים, סביר להניח שתשתמשו בכל שלושת שירותי ה-DRM.

ההמרה וההצפנה מתבצעות באמצעות האפליקציות הבאות:

ניקוי הצפנת המפתחות

קודם כל, צריך להבין טוב מה זה מפתח שקוף ולא לפני שמשתמשים בו. אם אתם לא רוצים להשתמש בשירות קיים של ניהול זכויות דיגיטליות (DRM), ולדעתכם אפשר להשתמש בהצפנה בסיסית של המדיה שלכם, תוכלו להשתמש ב-Clear Key. אבל, חשוב לזכור שהצפנה מהסוג הזה לא מספקת את אותה רמת אבטחה כמו בשימוש באחד משירותי ה-DRM. הסיבה לכך היא שצמד ערכי המפתחות לא מוצפן באמצעות מפתח אחר, בניגוד למפתחות מוצפנים שנוצרים באמצעות מפתח פענוח שמאוחסן בשרת רישיונות. בנוסף, התכונה 'ניקוי מפתח' שולחת את צמד ערכי המפתחות כטקסט פשוט. לכן, כשמצפינים את המדיה, המפתח הוא לא סוד.

יצירת מפתח

אפשר להשתמש באותה שיטה כדי ליצור מפתח גם ל-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

עכשיו אתם יודעים מהי הצפנת 'מפתח נקי' ומתי להשתמש בה. אבל מתי יש להשתמש בשירות DRM לאבטחה נוספת? כאן משתמשים ב-Widevine, או בשירות אחר, כדי להצפין את המדיה ולפענח אותה באופן מאובטח. Widevine תומך ב-MPEG-DASH וב-HLS, והוא ניהול זכויות דיגיטליות (DRM) של Google. Widevine משמש את דפדפני האינטרנט Google Chrome ו-Firefox, Android MediaDRM, Android TV ומכשירים אחרים למוצרי אלקטרוניקה שמשתמשים בתוספי מדיה מוצפנים ובתוספי Media Source, שבהם Widevine מפענח תוכן.

הצפנה באמצעות Widevine

רוב הדוגמאות במאמר הזה השתמשו בהצפנת מפתח שקוף. עם זאת, ב-Widevine כדאי להחליף את האפשרויות הבאות.

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

צריך להעתיק בדיוק מהדוגמה את כל מה שמופיע בפקודה decolxer (demux), מלבד שם הקבצים והדגל --content-id. הערך של --content-id הוא 16 או 32 ספרות הקסדצימליות אקראיות. עליך להשתמש במפתחות שמסופקים כאן במקום במפתחות שלך. דוגמאות נוספות זמינות במאמרי העזרה של Shaka Packager על השימוש ב-Widevine Key Server.

  1. demux (בנפרד) את האודיו והווידאו, מצפינים את הקבצים החדשים ויוצרים פלט של קובץ תיאור של מצגת מדיה (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. רמיקס (שילוב) בין שידורי האודיו והווידאו. אם אתם משתמשים ב-framework של וידאו, יכול להיות שלא תצטרכו לעשות זאת.

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

רצף המרות במדיה

בקטע הזה מוצגות הפקודות לפי הסדר שנדרש כדי לעבור מקובץ .mov גולמי לנכסים מוצפנים שנארזים בשביל DASH או HLS. כדי למטרות המחשה, אנחנו ממירים קובץ מקור לקצב העברת נתונים של 8MB ברזולוציה של 1080p (1920x1080). אפשר לשנות את הערכים האלה לפי הצורך.

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. demux (בנפרד) את האודיו והווידאו, מצפינים את הקבצים החדשים ויוצרים פלט של קובץ תיאור של מצגת מדיה (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. רמיקס (שילוב) בין שידורי האודיו והווידאו. אם אתם משתמשים ב-framework של וידאו, יכול להיות שלא תצטרכו לעשות זאת.

    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. demux (בנפרד) את האודיו והווידאו, מצפינים את הקבצים החדשים ויוצרים פלט של קובץ תיאור של מצגת מדיה (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. רמיקס (שילוב) בין שידורי האודיו והווידאו. אם אתם משתמשים ב-framework של וידאו, יכול להיות שלא תצטרכו לעשות זאת.

    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
    

זה היה הרבה לתקציר, אבל אני מקווה שעכשיו אתם יכולים להצפין את המדיה שלכם בביטחון. בשלב הבא נראה לכם איך להוסיף מדיה לאתר.