DRM (Digital Rights Management) — een set technologieën voor de bescherming van digitale content tegen ongeautoriseerd kopiëren en verspreiden. In mobiele apps wordt DRM gebruikt voor het versleutelen van video, audio en e-books, en zorgt voor naleving van licentieovereenkomsten tussen rechthebbenden en consumenten. Volgens Google Widevine Documentation, 2026 is DRM ingebouwd in de meeste streamingdiensten — Netflix, Spotify, Apple TV+ — en verplicht voor legale distributie van premium content.
Belangrijkste
DRM — is een verzameling cryptografische en softwarematige methoden die de toegang tot digitale content controleren. In tegenstelling tot eenvoudige versleuteling omvat DRM een licentiesysteem: de content wordt versleuteld en voor weergave is een sleutel nodig die pas wordt verstrekt na controle van de gebruikersrechten.
De hoofdtaak van DRM is het voorkomen van piraterij en het waarborgen van regionale beperkingen. Zonder DRM licentiëren contenteigenaren (filmstudio’s, platenmaatschappijen) hun content niet voor streamingplatforms. Volgens de Motion Picture Association (2025) heeft het gebruik van DRM de illegale verspreiding van films in streaming met 62% verminderd in vergelijking met het tijdperk van DVD-rips.
Bij mobiele ontwikkeling wordt DRM op het niveau van de mediaspeler ingebouwd: de ontwikkelaar gebruikt ExoPlayer (Android), AVPlayer (iOS) of Shaka Player (Web), die ingebouwde ontsleuteling van de versleutelde stream ondersteunen. De ontwikkelaar hoeft geen cryptografie te implementeren — het volstaat om de SDK voor licentiëring te integreren.
De standaard CENC (Common Encryption — ISO/IEC 23001-7) maakt het mogelijk één versleuteld mediabestand te gebruiken voor alle DRM-systemen. Content wordt eenmaal versleuteld en sleutels worden verspreid via verschillende licentieservers. Dit is cruciaal voor multiplatformdiensten: Netflix versleutelt een film eenmalig en levert deze op Android (Widevine), iOS (FairPlay) en Windows (PlayReady) zonder hercodering.
CENC gebruikt CBC-versleuteling met verschillende sleutels voor audio- en videosporen. Elke sleutel wordt in versleutelde vorm opgeslagen in het MPD-manifest (MPEG-DASH) of M3U8 (HLS). De contentidentificatie (KID) koppelt de versleutelde stream aan de licentie op de server — zonder geldige licentie wordt de sleutel niet ontsleuteld.
Het DRM-afspeelproces bestaat uit vier fasen: manifest laden, licentie verkrijgen, content ontsleutelen en weergeven. Elke fase wordt uitgevoerd door verschillende systeemcomponenten — de mediaspeler, de CDM-module en de licentieserver.
CDM — is een beveiligde software- of hardwaremodule die de content ontsleutelt. Op Android is CDM geïmplementeerd op het niveau van de MediaDrm-API, op iOS — ingebouwd in AVFoundation via AVContentKeySession. CDM geeft de sleutel nooit vrij aan de app — alle cryptografische bewerkingen worden uitgevoerd binnen een beveiligde omgeving (TEE — Trusted Execution Environment).
Op apparaten met hardwareondersteuning (Secure Level 1) werkt CDM binnen TEE — de sleutel komt nooit in het hoofdgeheugen van het apparaat terecht. Dit is een vereiste van studio’s voor het afspelen van content in 4K HDR. Op apparaten zonder TEE worden sleutels softwarematig ontsleuteld (L3), wat de beveiliging vermindert en de maximale kwaliteit beperkt tot 540p.
Op mobiele platforms domineren drie DRM-systemen. Elk is exclusief voor zijn ecosysteem, maar ondersteunt CENC, waardoor één versleutelde content op alle platforms kan worden gebruikt.
| DRM | Ontwikkelaar | Platform | Max. kwaliteit | Hardwarebeveiliging |
|---|---|---|---|---|
| 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 |
Voor een streamingdienst die op alle platforms werkt, is ondersteuning voor alle drie DRM-systemen vereist. Een praktische oplossing — gebruik een CDN met multi-DRM-ondersteuning (Muvi, Vualto, Axinom), die licentieaanvragen automatisch naar de juiste server routeren op basis van het apparaat van de gebruiker. Volgens Streaming Learning Center (2025) gebruikt 78% van de streamingdiensten een Multi-DRM-aanpak.
De MPEG-DASH-standaard met CENC vereenvoudigt de architectuur: content wordt eenmalig versleuteld met een gedeelde sleutel en het DRM-systeem wordt aan de clientzijde geselecteerd. De licentieserver ontvangt een verzoek met de apparaatidentificatie en retourneert de sleutel versleuteld voor de specifieke CDM. Geen verschil in content voor verschillende platforms — alleen een andere licentieserver.
Widevine — het DRM-systeem van Google, dat de facto de standaard is op Android. Het ondersteunt drie beveiligingsniveaus die bepalen waar en hoe content wordt ontsleuteld. Het beveiligingsniveau hangt af van de hardwaremogelijkheden van het apparaat en bepaalt de maximale resolutie van de content.
Widevine L1 (hardware) — het meest beveiligde niveau. Alle cryptografische bewerkingen worden uitgevoerd binnen de Trusted Execution Environment (TEE). De sleutel verlaat nooit het beveiligde gebied. Apparaten met L1 kunnen content tot 4K HDR afspelen. Google-certificering is vereist — een procedure die flagship-apparaten doorlopen.
Widevine L3 (software) — ontsleuteling vindt plaats in het hoofdgeheugen van het apparaat. De sleutel kan worden onttrokken door een technisch onderlegde aanvaller. De resolutie is beperkt tot 540p (960x540) voor premium content. Alle apparaten met Android ondersteunen L3, zelfs als ze niet zijn gecertificeerd voor L1.
Widevine L2 — een zeldzaam tussenliggend niveau waarbij ontsleuteling in TEE plaatsvindt, maar weergave via een onbeveiligd pad. Gebruikt op sommige Smart TV’s. Op mobiele apparaten komt het praktisch niet voor.
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 — hardwarebeveiliging"
"L3" -> "Widevine L3 — softwarebeveiliging"
else -> "Widevine $securityLevel"
}
}
De methode vraagt bij CDM de eigenschap securityLevel op via de Widevine-UUID. De geretourneerde waarde — een string L1, L2 of L3 — geeft het huidige beveiligingsniveau van het apparaat aan. Deze informatie is cruciaal voor streamingdiensten: als het apparaat alleen L3 heeft, kan 4K-content niet worden weergegeven.
FairPlay — het DRM-systeem van Apple, ingebouwd in alle platforms van het ecosysteem: iOS, iPadOS, macOS, tvOS en watchOS. In tegenstelling tot Widevine heeft FairPlay geen beveiligingsniveaus — de beveiliging wordt bepaald door het apparaat. Op iOS met Secure Enclave biedt FairPlay een beveiligingsniveau dat vergelijkbaar is met Widevine L1.
FairPlay werkt uitsluitend met het HLS (HTTP Live Streaming)-protocol. Content wordt verpakt in .ts-segmenten (MPEG-TS) of .m4s-fragmenten (fMP4). Het M3U8-manifest bevat de tag #EXT-X-KEY met de URI van de licentieserver (KSM — Key Server Module) en de IV-initialisatie. Bij het starten van de weergave leest AVPlayer het manifest en via AVContentKeySession wordt de sleutel aangevraagd.
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)
)
}
}
De gedelegeerde van AVContentKeySession ontvangt een sleutelaanvraag met de contentidentificatie (assetId). De app stuurt deze ID naar zijn eigen licentieserver (KSM), die de versleutelde sleutel retourneert. De aanroep processContentKeyResponse geeft de sleutel door aan CDM voor ontsleuteling. Als de licentie ongeldig is (verlopen, niet betaald), retourneert de server fout 403 en start AVPlayer niet met afspelen.
FairPlay ondersteunt persistent keys — het opslaan van de licentie op het apparaat voor offline weergave. Na het verkrijgen van de sleutel roept de app processContentKeyResponse aan met de vlag allowsPersistableKey. De sleutel wordt opgeslagen in de Keychain en kan worden gebruikt zonder de server te raadplegen bij herhaald bekijken. De geldigheidsduur van de offlinelicentie is echter beperkt — meestal 7–30 dagen, waarna vernieuwing nodig is.
Offlinelicenties worden opgeslagen in de beveiligde opslag van iOS — de Keychain. Bij een inbraakpoging (jalibreak, geheugendump extractie) vernietigt Secure Enclave de sleutels. Volgens Apple (2025) wordt persistent keys-technologie gebruikt in Apple TV+, Netflix en Disney+ voor het downloaden van content op iPad voor een reis.
PlayReady — DRM van Microsoft, gebruikt op Windows, Xbox en verouderde Windows Phone. Hoewel PlayReady op mobiele apparaten minder voorkomt dan Widevine en FairPlay, is het belangrijk voor universele streamingoplossingen die op alle Microsoft-platforms werken. PlayReady ondersteunt zowel software- als hardwarebeveiliging via TPM.
PlayReady gebruikt de SL (Security Level)-architectuur: SL2000 (software, analoog aan Widevine L3), SL3000 (hardware, analoog aan L1). Op Xbox Series X werkt PlayReady SL3000 via TEE+TPM — sleutels worden alleen in een beveiligde omgeving onttrokken. Dit maakt 4K Blu-ray afspelen op de console mogelijk zonder risico op kopiëren.
Volgens Microsoft Docs (2026) ondersteunt PlayReady CENC en kan het werken met MPEG-DASH via Media Source Extensions (MSE) in Edge-browsers. Voor mobiele apps op Android en iOS is PlayReady beschikbaar via SDK, maar wordt zelden gebruikt — voornamelijk voor zakelijke apps en Microsoft-mediadiensten.
Microsoft biedt PlayReady Native SDK voor Android en iOS. De integratie verloopt via ExoPlayer met de PlayReady-extensie: de ontwikkelaar voegt PlayReadyRenderer toe, die in de decoderingsketen wordt ingebouwd. ExoPlayer schakelt automatisch tussen Widevine en PlayReady afhankelijk van welke DRM in het MPD-manifest is gespecificeerd.
Hoewel PlayReady zelden voorkomt in mobiele apps, is de ondersteuning ervan verplicht voor diensten die deel uitmaken van het Microsoft-ecosysteem — bijvoorbeeld bedrijfsopleidingsplatforms op SharePoint en Stream. Volgens Microsoft (2025) wordt PlayReady gebruikt in 23% van de zakelijke media-oplossingen tegenover 62% voor Widevine.
Integratie van DRM in een mobiele app vereist geen cryptografische code — de ontwikkelaar werkt met een speler die DRM uit de doos ondersteunt. Laten we de integratie op Android via ExoPlayer met de DRM-extensie bekijken.
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 beheert de DRM-sessie: maakt een MediaDrm-sessie aan, verwerkt licentieaanvragen en geeft sleutels door aan de decoder. De parameter setMultiSession(true) maakt gelijktijdige ontsleuteling van meerdere streams (audio + video) in verschillende sessies mogelijk. MediaDrmCallback implementeert het HTTP-verzoek aan de licentieserver — meestal POST met de verzoekbody in SignedRequest-formaat.
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
}
De callback stuurt een POST-verzoek naar de licentieserver met de Widevine-UUID in de body. De server controleert de authenticatie van de gebruiker (token in de header) en retourneert de versleutelde sleutel. Als de gebruiker geen actief abonnement heeft, retourneert de server 403 Forbidden — ExoPlayer genereert een DRM-fout die via onPlayerError moet worden afgehandeld.
DRM-fouten treden op wanneer de licentie ongeldig is, verlopen is of het apparaat het vereiste beveiligingsniveau niet ondersteunt. ExoPlayer geeft de fout door via Player.Listener.onPlayerError met code TYPE_DRM_LICENSE_EXPIRED, TYPE_DRM_UNSUPPORTED of TYPE_SOURCE. Het wordt aanbevolen om de gebruiker een informatieve melding te tonen: „Content niet beschikbaar voor dit apparaat” of „Verleng uw abonnement om te kijken”.
Volgens analyses van streamingdiensten (2025) houdt tot 8% van de mislukte afspeelstarts verband met DRM-fouten. Hiervan is 60% verlopen licenties, 25% apparaatincompatibiliteit en 15% netwerkfouten bij sleutelaanvraag. Automatische herpoging na 5 seconden lost 40% van de netwerkfoutgevallen op.
Veelgestelde vragen
Technisch mogelijk op apparaten met Widevine L3 (softwarebeveiliging), waar de sleutel uit het geheugen kan worden onttrokken. Op L1 en FairPlay met Secure Enclave is omzeiling uiterst moeilijk — fysieke toegang tot TEE is vereist. Contentstudio’s richten zich op L1-apparaten voor premium content.
Waarschijnlijk is het apparaat niet gecertificeerd voor Widevine L1 en gebruikt het L3. Netflix beperkt de kwaliteit tot 540p op L3-apparaten. Controleer het Widevine-niveau via de DRM Info-app uit Google Play. Flagship-apparaten van Samsung, Pixel en OnePlus hebben meestal L1.
Gebruik Multi-DRM: Widevine voor Android, FairPlay voor Apple, PlayReady voor Windows. Diensten zoals Axinom of Vualto bieden een uniforme API voor alle drie DRM-systemen. Content wordt eenmalig versleuteld via CENC en de DRM-keuze vindt automatisch aan de clientzijde plaats.
Gebruik op iOS persistent keys van FairPlay via AVContentKeySession. Op Android — Widevine Offline License via ExoPlayer OfflineLicenseHelper. De sleutel wordt lokaal opgeslagen in Keychain (iOS) of KeyStore (Android) met een beperkte geldigheidsduur — meestal van 7 tot 30 dagen.
KID (Key ID) — een unieke 16-byte identificatie van de versleutelingssleutel in het CENC-manifest. Elke KID is gekoppeld aan een specifiek contentsegment (bijvoorbeeld een 10-minuten segment van een film). De licentieserver gebruikt KID om de bijbehorende sleutel in zijn database te vinden. Eén film kan tot 20 verschillende KID’s bevatten voor verschillende delen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook