בקטע הזה נסקור שתי אסטרטגיות שונות להצפנת המדיה, ונדגים איך משתמשים בהן עם 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.
ניתוק (הפרדה) של האודיו והווידאו, הצפנת הקבצים החדשים והפקת קובץ תיאור של הצגת מדיה (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"
רימקס (שילוב) של שידורי האודיו והווידאו. אם אתם משתמשים ב-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
ממירים את סוג הקובץ ואת הקודק.
בפקודה הזו אפשר להשתמש ב-
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
יצירת מפתח הצפנה עם מפתח ניקוי נכון.
openssl rand -hex 16 > media.key
ניתוק (הפרדה) של האודיו והווידאו, הצפנת הקבצים החדשים והפקת קובץ תיאור של הצגת מדיה (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
רימקס (שילוב) של שידורי האודיו והווידאו. אם אתם משתמשים ב-Video Framework, יכול להיות שלא תצטרכו לעשות זאת.
ffmpeg -i glocken_video.webm -i glocken_audio.webm -c copy glocken.webm
DASH/MP4
המרת סוג הקובץ, קודק הווידאו וקצב העברת הנתונים.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 tmp_glocken.mp4
יוצרים מפתח הצפנה של Clear Key.
openssl rand -hex 16 > media.key
ניתוק (הפרדה) של האודיו והווידאו, הצפנת הקבצים החדשים והפקת קובץ תיאור של הצגת מדיה (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
רימקס (שילוב) של שידורי האודיו והווידאו. אם אתם משתמשים ב-Video Framework, יכול להיות שלא תצטרכו לעשות זאת.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocken.mp4
HLS/MP4
פורמט HLS תומך רק ב-MP4, לכן קודם צריך להמיר את קובץ הווידאו לקונטיינר MP4 ולקודקים נתמכים.
המרת סוג הקובץ, קודק הווידאו וקצב העברת הנתונים.
ffmpeg -i glocken.mov -c:v libx264 -c:a aac -b:v 8M -strict -2 glocken.mp4
יוצרים מפתח הצפנה של Clear Key.
openssl rand -hex 16 > media.key
יצירת קובץ מידע של מפתח
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
זה היה הרבה מידע, אבל עכשיו תוכלו להצפין את המדיה שלכם בביטחון. בשלב הבא נסביר איך להוסיף מדיה לאתר.