הצפנת מדיה

Derek Herman
Derek Herman
Joe Medley
Joe Medley

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

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

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

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

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

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

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