הצפנת מדיה

Derek Herman
Derek Herman
Joe Medley
Joe Medley

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

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

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

הצפנה באמצעות מפתחות גלויים (Clear Key)

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

יצירת מפתח

אפשר להשתמש באותה שיטה כדי ליצור מפתח גם ל-DASH וגם ל-HLS. עושים זאת באמצעות OpenSSL. הפקודה הבאה תיצור מפתח הצפנה שמורכב מ-16 ערכים הקסדצימליים.

openssl rand -hex 16 > media.key

יצירת IV

בשלב הבא נוכל ליצור וקטור אתחול (IV).

openssl rand -hex 16
6143b5373a51cb46209cfed0d747da66

הצפנה באמצעות Clear Key

בדוגמה הבאה נעשה שימוש ב-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 ומתי כדאי להשתמש בה. אבל מתי כדאי להשתמש בשירות DRM לאבטחה נוספת? בשלב הזה, המערכת תשתמש ב-Widevine או בשירות אחר כדי להצפין את התוכן שלכם ולפענח אותו בצורה מאובטחת. Widevine תומך ב-MPEG-DASH וב-HLS, והוא פתרון DRM של Google. Widevine משמש את דפדפני האינטרנט Google Chrome ו-Firefox, את Android MediaDRM, את Android TV ומכשירי אלקטרוניקה אחרים לצרכן שמשתמשים בתוספים של מדיה מוצפנת ובתוספים של מקורות מדיה, שבהם Widevine מפענח את התוכן.

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

ברוב הדוגמאות במאמר הזה נעשה שימוש בהצפנת Clear Key. עם זאת, עבור Widevine צריך להחליף את האפשרויות הבאות.

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

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

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

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

בקטע הזה מוצגות הפקודות הנדרשות כדי לעבור מקובץ .mov גולמי לנכסים מוצפנים שמארזים ל-DASH או ל-HLS. כדי להמחיש את הנושא, נמיר קובץ מקור לקצב נתונים של 8Mbps ברזולוציה של 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. יוצרים מפתח הצפנה של Clear Key.

    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. רימקס (שילוב) של שידורי האודיו והווידאו. אם אתם משתמשים ב-Video 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. יוצרים מפתח הצפנה של Clear Key.

    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. רימקס (שילוב) של שידורי האודיו והווידאו. אם אתם משתמשים ב-Video 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. יוצרים מפתח הצפנה של Clear Key.

    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
    

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