DRM (Digital Rights Management) — скуп технологија заштите дигиталног садржаја од неовлашћеног копирања и дистрибуције. У мобилним апликацијама DRM се користи за шифровање видеа, аудија и електронских књига, обезбеђујући поштовање лиценцних уговора између власника права и потрошача. Према подацима Google Widevine Documentation, 2026, DRM је уграђен у већину стриминг сервиса — Netflix, Spotify, Apple TV+ — и обавезан је за легалну дистрибуцију премијум садржаја.
Најважније
DRM — скуп криптографских и софтверских метода који контролишу приступ дигиталном садржају. За разлику од једноставног шифровања, DRM укључује систем лиценцирања: садржај је шифрован и за његово гледање је потребан кључ, који се издаје тек након провере права корисника.
Основни задатак DRM-а је да спречи пиратерију и обезбеди поштовање регионалних ограничења. Без DRM-а власници садржаја (филмски студији, издавачке куће) не би лиценцирали свој садржај за стриминг платформе. Према подацима Motion Picture Association (2025), коришћење DRM-а смањило је нелегалну дистрибуцију филмова у стримингу за 62% у поређењу са ером DVD рипова.
У мобилном развоју DRM се уграђује на нивоу медиа плејера: програмер користи ExoPlayer (Android), AVPlayer (iOS) или Shaka Player (Web), који подржавају уграђено дешифровање шифрованог стрима. Програмер не мора да имплементира криптографију — довољно је да интегрише SDK за лиценцирање.
Стандард CENC (Common Encryption — ISO/IEC 23001-7) омогућава коришћење једног шифрованог медија фајла за све DRM системе. Садржај се шифрује једном, а кључеви се дистрибуирају преко различитих сервера лиценци. Ово је критично важно за мултиплатформске сервисе: Netflix шифрује филм једном и испоручује га на Android (Widevine), iOS (FairPlay) и Windows (PlayReady) без прекодирања.
CENC користи CBC шифровање са различитим кључевима за аудио и видео записе. Сваки кључ се чува у шифрованом облику у манифесту MPD (MPEG-DASH) или M3U8 (HLS). Идентификатор садржаја (KID) повезује шифровани стрим са лиценцом на серверу — без важеће лиценце кључ се не дешифрује.
Процес DRM репродукције састоји се од четири фазе: учитавање манифеста, добијање лиценце, дешифровање садржаја и приказивање. Сваку фазу извршавају различите компоненте система — медиа плејер, CDM модул и сервер лиценци.
CDM — заштићени софтверски или хардверски модул који врши дешифровање садржаја. На Android-у CDM је имплементиран на нивоу MediaDrm API-ја, а на iOS-у је уграђен у AVFoundation преко AVContentKeySession-а. CDM никада не открива кључ апликацији — све криптографске операције се извршавају унутар заштићеног окружења (TEE — Trusted Execution Environment).
На уређајима са хардверском подршком (Secure Level 1) CDM ради унутар TEE-а — кључ никада не доспева у главну меморију уређаја. То је захтев студија за репродукцију садржаја у 4K HDR. На уређајима без TEE-а кључеви се дешифрују програмски (L3), што смањује заштиту и ограничава максимални квалитет на 540p.
На мобилним платформама доминирају три DRM система. Сваки је ексклузиван за свој екосистем, али подржава CENC, што омогућава коришћење јединственог шифрованог садржаја на свим платформама.
| DRM | Програмер | Платформа | Макс. квалитет | Хардверска заштита |
|---|---|---|---|---|
| Widevine | Android, Chrome, Android TV | 4K HDR (L1) | TEE (L1) | |
| FairPlay | Apple | iOS, iPadOS, macOS, tvOS | 4K HDR (iOS) | Secure Enclave |
| PlayReady | Microsoft | Windows, Xbox, Windows Phone | 4K (SL3000) | TPM + TEE |
За стриминг сервис који ради на свим платформама потребна је подршка за сва три DRM-а. Практично решење је коришћење CDN-а са подршком за мулти-DRM (Muvi, Vualto, Axinom), који аутоматски усмеравају захтеве за лиценцама ка одговарајућем серверу у зависности од уређаја корисника. Према подацима Streaming Learning Center (2025), 78% стриминг сервиса користи Multi-DRM приступ.
Стандард MPEG-DASH са CENC-ом поједностављује архитектуру: садржај се шифрује једном заједничким кључем, а DRM систем се бира на клијенту. Сервер лиценци добија захтев са идентификатором уређаја и враћа кључ, шифрован за одређени CDM. Нема никакве разлике у садржају за различите платформе — само различити сервери лиценци.
Widevine — DRM систем компаније Google, који је де факто стандард на Android-у. Подржава три нивоа безбедности, који одређују где и како се врши дешифровање садржаја. Ниво безбедности зависи од хардверских могућности уређаја и одређује максималну резолуцију садржаја.
Widevine L1 (хардверски) — најзаштићенији ниво. Све криптографске операције се извршавају унутар Trusted Execution Environment-а (TEE). Кључ никада не напушта заштићену област. Уређаји са L1 могу да репродукују садржај до 4K HDR. Потребна је Google сертификација — процедура коју пролазе водећи (флагман) уређаји.
Widevine L3 (програмски) — дешифровање се извршава у главној меморији уређаја. Кључ може да извуче технички упућени нападач. Резолуција је ограничена на 540p (960x540) за премијум садржај. Сви Android уређаји подржавају L3, чак и ако нису сертификовани за L1.
Widevine L2 — редак прелазни ниво, где се дешифровање извршава у TEE-у, али је рендеровање на незаштићеном путу. Користи се на неким Smart TV уређајима. На мобилним уређајима се практично не среће.
import android.media.MediaDrm
import android.media.UUID
fun checkWidevineLevel(): String {
val widevineUuid = UUID.fromString("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed")
val mediaDrm = MediaDrm(widevineUuid)
val securityLevel = mediaDrm.getPropertyString(
MediaDrm.PROPERTY_SECURITY_LEVEL
)
return when (securityLevel) {
"L1" -> "Widevine L1 — хардверска заштита"
"L3" -> "Widevine L3 — софтверска заштита"
else -> "Widevine $securityLevel"
}
}
Метод захтева од CDM-а својство securityLevel преко Widevine UUID-а. Враћена вредност — ниска L1, L2 или L3, која указује на тренутни ниво заштите уређаја. Ова информација је кључна за стриминг сервисе: ако уређај има само L3, садржај у 4K не сме да се приказује.
FairPlay — DRM систем компаније Apple, уграђен у све платформе екосистема: iOS, iPadOS, macOS, tvOS и watchOS. За разлику од Widevine-а, FairPlay нема нивое безбедности — заштиту одређује уређај. На iOS-у са Secure Enclave, FairPlay пружа ниво заштите упоредив са Widevine L1.
FairPlay ради искључиво са протоколом HLS (HTTP Live Streaming). Садржај се пакује у .ts сегменте (MPEG-TS) или .m4s фрагменте (fMP4). Манифест M3U8 садржи тег #EXT-X-KEY са URI адресом сервера лиценци (KSM — Key Server Module) и IV за иницијализацију. При покретању репродукције AVPlayer чита манифест и преко AVContentKeySession-а захтева кључ.
import AVFoundation
let contentKeySession = AVContentKeySession(keySystem: fairPlayStreaming)
let player = AVPlayer(playerItem: playerItem)
contentKeySession.setDelegate(self, queue: delegateQueue)
func contentKeySession(
_ session: AVContentKeySession,
didProvide keyRequest: AVContentKeyRequest
) {
let assetId = keyRequest.identifier as! String
sendLicenseRequest(assetId) { licenseData in
keyRequest.processContentKeyResponse(
AVContentKeyResponse(fairPlayStreamingKeyResponseData: licenseData)
)
}
}
Делегат AVContentKeySession-а добија захтев за кључ са идентификатором садржаја (assetId). Апликација шаље овај ID на свој сервер лиценци (KSM), који враћа шифровани кључ. Позив processContentKeyResponse прослеђује кључ у CDM за дешифровање. Ако је лиценца неважећа (истекла, неплаћена), сервер враћа грешку 403, и AVPlayer не започиње репродукцију.
FairPlay подржава persistent keys — чување лиценце на уређају за офлајн гледање. Након добијања кључа, апликација позива processContentKeyResponse са флагом allowsPersistableKey. Кључ се чува у Keychain-у и може да се користи без обраћања серверу при поновном гледању. Међутим, рок важења офлајн лиценце је ограничен — обично 7–30 дана, након чега је потребно обнављање.
Офлајн лиценце се чувају у заштићеном iOS складишту — Keychain-у. При покушају хакерства (jalibreak, издвајање дампа) Secure Enclave уништава кључеве. Према подацима Apple-а (2025), технологија persistent keys користи се у Apple TV+, Netflix-у и Disney+ за преузимање садржаја на iPad пре путовања.
PlayReady — DRM компаније Microsoft, који се користи на Windows, Xbox и старијим Windows Phone уређајима. Иако се на мобилним уређајима PlayReady среће ређе од Widevine-а и FairPlay-а, важан је за универзална стриминг решења која раде на свим Microsoft платформама. PlayReady подржава и програмску и хардверску заштиту преко TPM-а.
PlayReady користи архитектуру SL (Security Level): SL2000 (програмска, аналог Widevine L3) и SL3000 (хардверска, аналог L1). На Xbox Series X, PlayReady SL3000 ради преко TEE+TPM-а — кључеви се издвајају само у заштићеном окружењу. Ово омогућава репродукцију 4K Blu-ray-а на конзоли без ризика од копирања.
Према подацима Microsoft Docs (2026), PlayReady подржава CENC и може да ради са MPEG-DASH преко Media Source Extensions (MSE) у Edge прегледачима. За мобилне апликације на Android-у и iOS-у PlayReady је доступан преко SDK-а, али се користи ретко — углавном за корпоративне апликације и Microsoft медија сервисе.
Microsoft пружа PlayReady Native SDK за Android и iOS. Интеграција се врши преко ExoPlayer-а са PlayReady екстензијом: програмер додаје PlayReadyRenderer, који се уграђује у ланац декодирања. ExoPlayer аутоматски пребацује између Widevine-а и PlayReady-а у зависности од тога која DRM је наведена у MPD манифесту.
Иако се PlayReady ретко среће у мобилним апликацијама, његова подршка је обавезна за сервисе унутар Microsoft екосистема — на пример, корпоративне платформе за обуку на SharePoint и Stream-у. Према подацима Microsoft-а (2025), PlayReady се користи у 23% корпоративних медија решења, у поређењу са 62% за Widevine.
Интеграција DRM-а у мобилну апликацију не захтева писање криптографског кода — програмер ради са плејером који подржава DRM из кутије. Размотримо интеграцију на Android-у преко ExoPlayer-а са DRM екстензијом.
val drmSessionManager = DefaultDrmSessionManager.Builder()
.setUuidAndExoMediaDrmProvider(
C.WIDEVINE_UUID,
FrameworkMediaDrm.DEFAULT_PROVIDER
)
.setMultiSession(true)
.build(mediaDrmCallback)
val mediaItem = MediaItem.Builder()
.setUri(mpdUrl)
.setDrmConfiguration(
MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
.setLicenseUri(licenseUrl)
.setLicenseRequestHeaders(headers)
.build()
)
.build()
exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
DefaultDrmSessionManager управља DRM сесијом: креира MediaDrm сесију, обрађује захтеве за лиценцама и прослеђује кључеве декодеру. Параметар setMultiSession(true) омогућава истовремено дешифровање више стримова (аудио + видео) у различитим сесијама. MediaDrmCallback имплементира HTTP захтев ка серверу лиценци — обично POST са телом захтева у SignedRequest формату.
val mediaDrmCallback = DefaultDrmSessionManager.MediaDrmCallback {
url, requestBody ->
val response = OkHttpClient().newCall(
Request.Builder()
.url(url)
.post(RequestBody.create(requestBody, MediaType.parse("application/octet-stream")))
.addHeader("Authorization", "Bearer " )
.build()
).execute()
val responseBytes = response.body?.bytes()
?: throw DrmSessionException(Exception("Empty license response"))
responseBytes
}
Callback шаље POST захтев на сервер лиценци са Widevine UUID у телу. Сервер проверава аутентификацију корисника (токен у заглављу) и враћа шифровани кључ. Ако корисник нема активну претплату, сервер враћа 403 Forbidden — ExoPlayer генерише DRM грешку, коју треба обрадити преко onPlayerError.
DRM грешке настају када је лиценца неважећа, истекла, или уређај не подржава потребан ниво заштите. ExoPlayer прослеђује грешку преко Player.Listener.onPlayerError са кодом TYPE_DRM_LICENSE_EXPIRED, TYPE_DRM_UNSUPPORTED или TYPE_SOURCE. Препоручује се да се кориснику прикаже информативна порука: „Садржај није доступан за овај уређај“ или „Обновите претплату за гледање“.
Према подацима аналитике стриминг сервиса (2025), до 8% неуспешних покретања репродукције повезано је са DRM грешкама. Од тога 60% чине истекле лиценце, 25% некомпатибилност уређаја и 15% мрежне грешке при захтеву кључа. Аутоматски поновни покушај након 5 секунди решава 40% случајева мрежних грешака.
Често постављана питања
Технички је могуће на уређајима са Widevine L3 (програмска заштита), где кључ може да се извуче из меморије. На L1 и FairPlay-у са Secure Enclave заобилажење је изузетно сложено — потребан је физички приступ TEE-у. Студији садржаја се оријентишу на L1 уређаје за премијум садржај.
Највероватније уређај није сертификован за Widevine L1 и користи L3. Netflix ограничава квалитет на 540p на L3 уређајима. Проверите ниво Widevine-а преко апликација DRM Info из Google Play-а. Водећи уређаји Samsung, Pixel и OnePlus обично имају L1.
Користите Multi-DRM: Widevine за Android, FairPlay за Apple, PlayReady за Windows. Сервиси попут Axinom-а или Vualto-а пружају јединствени API за сва три DRM-а. Садржај се шифрује једном преко CENC-а, а избор DRM-а се дешава аутоматски на страни клијента.
На iOS-у користите persistent keys FairPlay-а преко AVContentKeySession-а. На Android-у — Widevine Offline License преко ExoPlayer OfflineLicenseHelper-а. Кључ се чува локално у Keychain-у (iOS) или KeyStore-у (Android) са ограниченим роком важења — обично од 7 до 30 дана.
KID (Key ID) — јединствени 16-бајтни идентификатор кључа шифровања у CENC манифесту. Сваки KID је везан за одређени део садржаја (на пример, 10-минутни сегмент филма). Сервер лиценци користи KID за проналажење одговарајућег кључа у својој бази података. Један филм може да садржи до 20 различитих KID-ова за различите делове.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође