بسیاری از اوقات می خواهیم سرویسی را به کاربران ارائه دهیم که حاوی رسانه هایی مثل ویدیو است. این ویدیو ها توسط خودمان تولید شده است و علاقه ای نداریم به راحتی در اختیار دیگر افراد قرار بگیرد و می خواهیم در قبال ارائه آن ها، از کاربر مبلغی را دریافت کنیم. اگر از این محتوا ها به درستی محافظت نکنیم، یک کاربر می تواند با خریداری آن، به صورت رایگان در فضا اینترنت به اشتراک بگذارد و دیگر کسی تمایل به پرداخت هزینه برای محتوایی که رایگان در دسترس هست را نخواهد داشت.

مسئله

برای کی مهمه؟

برای همه افرادی که در طراحی و پیاده سازی یک سرویس ارائه محتوا نظیر فیلم آموزشی، کلاس های درس،‌ موسیقی و … درگیر هستند و در به ازای ارايه این سرویس هزینه ای دریافت می کنند. (یا بطور کلی می خواهند فقط کاربران خاصی به این محتوا دسترسی داشته باشند و تا حد امکان از انتشار این محتوا در فضای عمومی جلوگیری شود.)

شرح مسئله:

همان طور که در ابتدا هم گفته شد، در این متن سعی می کنیم چند نمونه از راهکار های media content protection را ارائه دهیم و از نظر پیاده سازی در سمت کلاینت (به طور خاص فلاتر) مقایسه می کنیم.

راه حل ها:

پیش از پرداختن به راهکار ها، خوب است مفهومی به نام analog loophole را بدانیم. این مفهوم بیان می کند که هر محتوایی (مثل صوت یا ویدیو) که به نوعی از حالت دیجیتال به شکل آنالوگ و قابل فهم برای انسان تبدیل شود،‌قابل capture کردن است. پس هیچ گاه به طور صد درصد نمی توانیم در برابر انتشار این محتوا ها محافظت کنیم بلکه هدف این است که این کار را سخت کنیم.

DRM:

drm یا digital rights management یک شیوه امن کردن محتوا دیجیتال است تا جلوی استفاده‌ی unauthorized از آن را بگیریم. در واقع این اطمینان را می دهد که اولا محتوا به شکل رمز شده به دست کاربر  برسد و ذخیره می شود و ثانیا تنها کاربران و دستگاه هایی آن را اجرا می کنند که اجازه این کار را دارند.

قبل از stream شدن محتوا به کلاینت، محتوا باید رمز شود و به شیوه های خاصی (بسته به این که در چه دستگاه مقصدی می خواهد اجرا شود) بسته بندی شود.

وقتی کاربر می خواهد محتوا را مشاهده کند، player درخواست دریافت یک کلید (یا لایسنس) را به license server می دهد. این سرور مطمئن می شود که این کاربر و این دستگاه اجازه اجرای این محتوا را دارند، سپس کلید یا لایسنس را ارسال می کند.

سپس این player با در دست داشتن محتوا رمز شده و لایسنس، محتوا را برای کاربر اجرا می کند.

در شکل زیر مولفه های این فرایند نشان داده شده اند:

پس سه مولفه اصلی داریم:

content: که محتوای رمز شده و بسته بندی شده است که در سرور قرار دارد.

Player: که به وسیله لایسنس، محتوا را اجرا می کند. این برنامه در سطوح پایین مثل سیستم عامل و حتی سخت افزار این کار را انجام می دهد. پس یک برنامه عادی به آن دسترسی ندارد و حتی به صورت دقیق عملکرد آن را نخواهد دانست. فرض می شود که در سطح سیستم عامل، ما امنیت داریم یعنی کدی که برای این برنامه زده شده است به درستی کار را انجام می دهد و کسی به آن دسترسی ندارد.

به همین دلیل این برنامه در پلتفرم های مختلف متفاوت است. (player را می توان بخش عمده ای از DRM system در نظر گرفت).

در حدول زیر DRM system های مختلف و پلتفرم هایی که پشتیبانی می کنند آورده شده است:

و license server.

برای مطالعه دقیق تر در مورد شیوه عملکرد drm به لینک های بخش منایع مراجعه کنید.

در فلاتر با استفاده از کتاب خانه drm_wv_fp_player می توان محتوای drm را اجرا کرد. اما فعلا این کتابخانه تنها اندروید را پشتیبانی می کند و توسعه دهندگان آن در تلاش هستند در آینده iOS نیز پشتیبانی شود.

به طور کلی پیاده سازی کلاینت برای این شیوه، دردسر های زیادی دارد که از دلایل اصلی آن platform specific بودن آن است. همچنین پیاده سازی بک اند آن هم کار ساده ای نیست. برای همین توصیه می شود از سرویس ها (غیررایگان) آماده استفاده شود.

custom player

یک شیوه دیگر برای محافظت محتوا این است که خودمان یک player را بنویسیم! برای این کار محتوا را با یک شیوه مدنظر در سرور نگه می داریم. کاربر آن را به شکل رمز شده دریافت می کند. سپس کاربر یک کلید را از license server برای مشاهده محتوا در خواست می کند.

حال کافی است یک player ای داشته باشیم که با یک الگوریتم خاص، با استفاده از license و محتوای رمز شده، آن را اجرا کند. می توانیم کد این برنامه را obfuscate کنیم. بنابراین از دید کاربر یک black box خواهیم داشت که ورودی license و محتوا رمز شده می گیرد و آن را نمایش می دهد.

حتی کاربر می تواند محتوا را دانلود شده به صورت محلی نگه دارد و هر بار با این player آن را مشاهده کند. با این کار یک فرد تنها در صورتی می تواند به محتوای اصلی decrypted دسترسی پیدا کند که شیوه کارکرد player را بفهمد. که این کار با obfuscate کردن دشوار می شود.

البته در این روش اگر هر کسی لایسنس و محتوا را داشته باشد، توسط player می تواند محتوا را ببیند. برای رفع این مسئله می توان این کار را کرد که player در ابتدا مطمين شود که لایسنس برای کاربر فعلی است، سپس محتوا را اجرا کند. برای این کار ایده من این است که بخشی از لایسنس شامل مقدار hash رمز عبور کاربر باشد. و playerبه عنوان ورودی رمز کاربر را هم بپرسد سپس چک بکند که hash رمز ورودی با لایسنس تطابق دارد یا نه. در این صورت اگر یک کاربر بخواهد یک محتوا را نشر دهد، باید عملا رمز خود را نیز نشر دهد!

به این کار در واقع security through obscurity می گویند که در کل ایده مناسبی برای برقراری امنیت نیست، اما در این مورد خاص گزینه خوبی است:)

encryption only

شیوه آخر که به راحتی قابل دور زدن است، این است که صرفا محتوا را در حین انتقال از سرور با یک کلید رمز کنیم. کلاینت محتوا رمز شده با کلید رمزنگاری را از سرور دریافت کند و محتوا را رمز گشایی کرده و اجرا کند. این شیوه به سادگی قابل پیاده سازی است اما کافیست که کاربر رمز و محتوای رمز شده را پیدا کند. (که این کار تنها بوسیله api و بدون نیاز به استفاده از کلاینتی که ما در اختیارش قرار می دهیم هم امکان پذیر است)، سپس محتوا را رمز گشایی کند و در اختیار عموم قرار دهد.

نتیجه:

به نظر خودم بهترین گزینه برای برنامه ای که کلاینت آن فلاتر است، شیوه دوم است. زیرا هم امکان obfuscate کردن در فلاتر وجود دارد هم درگیر استفاده از rdm که هنوز کتاب خانه ای نیست که به طور کامل آن را پیاده سازی کرده باشد، نمی شویم و هم به امنیتِ کم که توسط شیوه سوم ارائه می شود اکتفا نمی کنیم. البته لازم است مجددا یادآوری کنم که هیچ کدام از شیوه های بالا به طور صددرصد جلوی نشر محتوا را نمی گیرند.

منابع:

https://stackoverflow.com/questions/7625205/how-to-protect-media-content-video-audio-on-android-from-being-saved-redistri

http://www.aladdin.cs.cmu.edu/papers/pdfs/y2004/piracyprobl.pdf

https://en.wikipedia.org/wiki/Analog_hole

https://www.intertrust.com/blog/what-is-digital-rights-management-and-how-does-it-work/

https://www.brightcove.com/en/blog/2018/07/dealing-drm-understanding-drm-and-how-produce-protected-content

https://www.streamingmedia.com/Articles/Editorial/Featured-Articles/How-to-Protect-Your-Content-With-DRM-132289.aspx

https://github.com/flutter/flutter/issues/24923

https://github.com/darwinvtomy/drm_wv_fp_player

درباره نیلوا

ایران،تهران

ناحیه نوآوری شریف

بلوار جواد اکبری

برج فناوری بنتک

T: 09150773830
E: admin[@]nilva.ir