בחלק הזה נעסוק בשתי אסטרטגיות שונות להצפנת מדיה, ונספק כמה דוגמאות מעשיות לשימוש בהן עם 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
בשלב הבא נוכל ליצור וקטור אתחול (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 ומכשירים אחרים למוצרי אלקטרוניקה שמשתמשים בתוספי מדיה מוצפנים ובתוספי Media Source, שבהם Widevine מפענח תוכן.
הצפנה באמצעות Widevine
רוב הדוגמאות במאמר הזה השתמשו בהצפנת מפתח שקוף. עם זאת, ב-Widevine כדאי להחליף את האפשרויות הבאות.
--enable_fixed_key_encryption \
--enable_fixed_key_decryption \
--keys label=:key=INSERT_KEY_HERE:key_id=INSERT_KEY_ID_HERE
צריך להעתיק בדיוק מהדוגמה את כל מה שמופיע בפקודה decolxer (demux), מלבד שם הקבצים והדגל --content-id
. הערך של --content-id
הוא 16 או 32 ספרות הקסדצימליות אקראיות. עליך להשתמש במפתחות שמסופקים כאן במקום במפתחות שלך. דוגמאות נוספות זמינות במאמרי העזרה של Shaka Packager על השימוש ב-Widevine Key Server.
demux (בנפרד) את האודיו והווידאו, מצפינים את הקבצים החדשים ויוצרים פלט של קובץ תיאור של מצגת מדיה (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"
רמיקס (שילוב) בין שידורי האודיו והווידאו. אם אתם משתמשים ב-framework של וידאו, יכול להיות שלא תצטרכו לעשות זאת.
ffmpeg -i glocken_video.mp4 -i glocken_audio.m4a -c copy glocke.mp4
רצף המרות במדיה
בקטע הזה מוצגות הפקודות לפי הסדר שנדרש כדי לעבור מקובץ .mov
גולמי לנכסים מוצפנים שנארזים בשביל DASH או HLS. כדי למטרות המחשה, אנחנו ממירים קובץ מקור לקצב העברת נתונים של 8MB ברזולוציה של 1080p (1920x1080). אפשר לשנות את הערכים האלה לפי הצורך.
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
demux (בנפרד) את האודיו והווידאו, מצפינים את הקבצים החדשים ויוצרים פלט של קובץ תיאור של מצגת מדיה (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
רמיקס (שילוב) בין שידורי האודיו והווידאו. אם אתם משתמשים ב-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
יצירת מפתח הצפנה עם מפתח ניקוי נכון.
openssl rand -hex 16 > media.key
demux (בנפרד) את האודיו והווידאו, מצפינים את הקבצים החדשים ויוצרים פלט של קובץ תיאור של מצגת מדיה (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
רמיקס (שילוב) בין שידורי האודיו והווידאו. אם אתם משתמשים ב-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
יצירת מפתח הצפנה עם מפתח ניקוי נכון.
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
זה היה הרבה לתקציר, אבל אני מקווה שעכשיו אתם יכולים להצפין את המדיה שלכם בביטחון. בשלב הבא נראה לכם איך להוסיף מדיה לאתר.