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