הצפנת מדיה

דרק הרמן
דרק הרמן
ג'ו מדלי
ג'ו מדלי

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

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

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

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

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

כל מה שמופיע בפקודה desinglexer (demux), מלבד שם הקבצים שלכם והדגל --content-id, צריך להעתיק בדיוק מהדוגמה. הערך --content-id מכיל 16 או 32 ספרות הקסדצימליות אקראיות. השתמשו במפתחות שסופקו כאן במקום במפתחות שלכם. לדוגמאות נוספות, קראו את מסמכי התיעוד של Shaka בנושא השימוש ב-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. לצורך המחשה, אנחנו ממירים קובץ מקור לקצב העברת נתונים של 8Mbs ברזולוציה של 1080p (1920 x 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
    

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