DRM (Digital Rights Management) — en uppsättning tekniker för att skydda digitalt innehåll mot obehörig kopiering och spridning. I mobilappar används DRM för att kryptera video, ljud och e-böcker, vilket säkerställer efterlevnad av licensavtal mellan rättighetsinnehavare och konsumenter. Enligt Google Widevine Documentation, 2026 är DRM inbyggt i de flesta streamingtjänster — Netflix, Spotify, Apple TV+ — och obligatoriskt för laglig distribution av premiuminnehåll.
Viktigaste
DRM — är en samling kryptografiska och mjukvarubaserade metoder som kontrollerar åtkomsten till digitalt innehåll. Till skillnad från enkel kryptering inkluderar DRM ett licenssystem: innehållet krypteras och för att visa det krävs en nyckel som utfärdas först efter kontroll av användarens rättigheter.
DRM:s huvuduppgift är att förebygga piratkopiering och säkerställa regionala begränsningar. Utan DRM licensierar inte innehållsägare (filmstudior, skivbolag) sitt innehåll till streamingplattformar. Enligt Motion Picture Association (2025) har användningen av DRM minskat olaglig spridning av filmer i streaming med 62% jämfört med eran av DVD-rippar.
I mobilutveckling är DRM inbyggt på mediespelarens nivå: utvecklaren använder ExoPlayer (Android), AVPlayer (iOS) eller Shaka Player (Web), som stödjer inbyggd dekryptering av den krypterade strömmen. Utvecklaren behöver inte implementera kryptografi — det räcker med att integrera SDK för licensiering.
Standarden CENC (Common Encryption — ISO/IEC 23001-7) gör det möjligt att använda en enda krypterad mediafil för alla DRM-system. Innehållet krypteras en gång och nycklar distribueras via olika licensservrar. Detta är kritiskt för plattformsoberoende tjänster: Netflix krypterar filmen en gång och levererar den till Android (Widevine), iOS (FairPlay) och Windows (PlayReady) utan omkodning.
CENC använder CBC-kryptering med olika nycklar för ljud- och videospår. Varje nyckel lagras i krypterad form i manifestet MPD (MPEG-DASH) eller M3U8 (HLS). Innehållsidentifieraren (KID) kopplar den krypterade strömmen till licensen på servern — utan giltig licens dekrypteras inte nyckeln.
DRM-uppspelningsprocessen består av fyra steg: ladda manifest, hämta licens, dekryptera innehåll och visa. Varje steg utförs av olika systemkomponenter — mediespelaren, CDM-modulen och licensservern.
CDM — är en skyddad mjukvaru- eller hårdvarumodul som utför dekryptering av innehåll. På Android är CDM implementerat på MediaDrm-API-nivån, på iOS — inbyggt i AVFoundation via AVContentKeySession. CDM avslöjar aldrig nyckeln för appen — alla kryptografiska operationer utförs i en skyddad miljö (TEE — Trusted Execution Environment).
På enheter med hårdvarustöd (Secure Level 1) fungerar CDM inom TEE — nyckeln kommer aldrig in i enhetens huvudminne. Detta är ett krav från studior för uppspelning av innehåll i 4K HDR. På enheter utan TEE dekrypteras nycklar med mjukvara (L3), vilket minskar skyddet och begränsar maximal kvalitet till 540p.
På mobila plattformar dominerar tre DRM-system. Var och en är exklusiv för sitt ekosystem, men stödjer CENC, vilket möjliggör användning av ett enda krypterat innehåll på alla plattformar.
| DRM | Utvecklare | Plattform | Max. kvalitet | Hårdvaruskydd |
|---|---|---|---|---|
| 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 |
För en streamingtjänst som fungerar på alla plattformar krävs stöd för alla tre DRM. En praktisk lösning — använd en CDN med multi-DRM-stöd (Muvi, Vualto, Axinom), som automatiskt dirigerar licensbegäranden till rätt server baserat på användarens enhet. Enligt Streaming Learning Center (2025) använder 78% av streamingtjänsterna en Multi-DRM-metod.
MPEG-DASH-standarden med CENC förenklar arkitekturen: innehållet krypteras en gång med en delad nyckel och DRM-systemet väljs på klientsidan. Licensservern tar emot en begäran med enhetsidentifieraren och returnerar nyckeln krypterad för det specifika CDM. Ingen skillnad i innehåll för olika plattformar — bara en annan licensserver.
Widevine — Googles DRM-system, som är de facto-standarden på Android. Det stödjer tre säkerhetsnivåer som bestämmer var och hur dekryptering av innehåll sker. Säkerhetsnivån beror på enhetens hårdvarukapacitet och bestämmer den maximala upplösningen för innehållet.
Widevine L1 (hårdvara) — den mest skyddade nivån. Alla kryptografiska operationer utförs inom Trusted Execution Environment (TEE). Nyckeln lämnar aldrig det skyddade området. Enheter med L1 kan spela upp innehåll upp till 4K HDR. Google-certifiering krävs — en procedur som flaggskeppsenheter genomgår.
Widevine L3 (mjukvara) — dekryptering sker i enhetens huvudminne. Nyckeln kan extraheras av en tekniskt kunnig angripare. Upplösningen är begränsad till 540p (960x540) för premiuminnehåll. Alla enheter med Android stödjer L3, även om de inte är certifierade för L1.
Widevine L2 — en sällsynt mellanliggande nivå där dekryptering sker i TEE men rendering via en oskyddad väg. Används på vissa Smart TV-apparater. Förekommer praktiskt taget inte på mobila enheter.
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 — hårdvaruskydd"
"L3" -> "Widevine L3 — mjukvaruskydd"
else -> "Widevine $securityLevel"
}
}
Metoden begär egenskapen securityLevel från CDM via Widevines UUID. Det returnerade värdet — en sträng L1, L2 eller L3 — anger enhetens aktuella skyddsnivå. Denna information är kritisk för streamingtjänster: om enheten bara har L3 kan 4K-innehåll inte visas.
FairPlay — Apples DRM-system, inbyggt i alla plattformar i ekosystemet: iOS, iPadOS, macOS, tvOS och watchOS. Till skillnad från Widevine har FairPlay inga säkerhetsnivåer — skyddet bestäms av enheten. På iOS med Secure Enclave ger FairPlay en skyddsnivå som är jämförbar med Widevine L1.
FairPlay fungerar uteslutande med protokollet HLS (HTTP Live Streaming). Innehållet paketeras i .ts (MPEG-TS)-segment eller .m4s (fMP4)-fragment. M3U8-manifestet innehåller taggen #EXT-X-KEY med URI till licensservern (KSM — Key Server Module) och IV-initiering. När uppspelningen startar läser AVPlayer manifestet och begär nyckeln via 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)
)
}
}
Delegaten för AVContentKeySession tar emot en nyckelbegäran med innehållsidentifieraren (assetId). Appen skickar detta ID till sin egen licensserver (KSM), som returnerar den krypterade nyckeln. Anropet processContentKeyResponse skickar nyckeln till CDM för dekryptering. Om licensen är ogiltig (utgången, obetald) returnerar servern fel 403 och AVPlayer startar inte uppspelning.
FairPlay stödjer persistent keys — att spara licensen på enheten för offlinevisning. Efter att ha fått nyckeln anropar appen processContentKeyResponse med flaggan allowsPersistableKey. Nyckeln sparas i Keychain och kan användas utan att kontakta servern vid upprepad visning. Offlinelicensens giltighetstid är dock begränsad — vanligtvis 7–30 dagar, därefter krävs förnyelse.
Offlinelicenser lagras i iOS:s skyddade lagring — Keychain. Vid ett intrångsförsök (jalibreak, extrahering av minnesdump) förstör Secure Enclave nycklarna. Enligt Apple (2025) används persistent keys-teknik i Apple TV+, Netflix och Disney+ för att ladda ner innehåll till iPad inför en resa.
PlayReady — DRM från Microsoft, som används på Windows, Xbox och föråldrade Windows Phone. Även om PlayReady på mobila enheter är mindre vanligt än Widevine och FairPlay, är det viktigt för universella streaminglösningar som fungerar på alla Microsoft-plattformar. PlayReady stödjer både mjukvaru- och hårdvaruskydd via TPM.
PlayReady använder arkitekturen SL (Security Level): SL2000 (mjukvara, analog med Widevine L3), SL3000 (hårdvara, analog med L1). På Xbox Series X fungerar PlayReady SL3000 via TEE+TPM — nycklar extraheras endast i en skyddad miljö. Detta möjliggör 4K Blu-ray-uppspelning på konsolen utan risk för kopiering.
Enligt Microsoft Docs (2026) stödjer PlayReady CENC och kan arbeta med MPEG-DASH via Media Source Extensions (MSE) i Edge-webbläsare. För mobilappar på Android och iOS är PlayReady tillgängligt via SDK, men används sällan — främst för företagsappar och Microsofts medietjänster.
Microsoft tillhandahåller PlayReady Native SDK för Android och iOS. Integrationen sker via ExoPlayer med PlayReady-tillägget: utvecklaren lägger till PlayReadyRenderer, som bäddas in i avkodningskedjan. ExoPlayer växlar automatiskt mellan Widevine och PlayReady beroende på vilket DRM som anges i MPD-manifestet.
Även om PlayReady sällan förekommer i mobilappar är dess stöd obligatoriskt för tjänster som är en del av Microsofts ekosystem — till exempel företagsutbildningsplattformar på SharePoint och Stream. Enligt Microsoft (2025) används PlayReady i 23% av företagens medielösningar jämfört med 62% för Widevine.
Integration av DRM i en mobilapp kräver inte att man skriver kryptografisk kod — utvecklaren arbetar med en spelare som stödjer DRM direkt. Låt oss titta på integrationen på Android via ExoPlayer med DRM-tillägget.
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 hanterar DRM-sessionen: skapar en MediaDrm-session, bearbetar licensbegäranden och skickar nycklar till avkodaren. Parametern setMultiSession(true) möjliggör samtidig dekryptering av flera strömmar (ljud + video) i olika sessioner. MediaDrmCallback implementerar HTTP-begäran till licensservern — vanligtvis POST med begärandet i SignedRequest-format.
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 skickar en POST-begäran till licensservern med Widevines UUID i brödtexten. Servern kontrollerar användarens autentisering (token i huvudet) och returnerar den krypterade nyckeln. Om användaren inte har ett aktivt abonnemang returnerar servern 403 Forbidden — ExoPlayer genererar ett DRM-fel som måste hanteras via onPlayerError.
DRM-fel uppstår när licensen är ogiltig, utgången eller enheten inte stödjer den erforderliga skyddsnivån. ExoPlayer skickar felet via Player.Listener.onPlayerError med koden TYPE_DRM_LICENSE_EXPIRED, TYPE_DRM_UNSUPPORTED eller TYPE_SOURCE. Det rekommenderas att visa ett informativt meddelande för användaren: „Innehåll inte tillgängligt för den här enheten” eller „Förläng din prenumeration för att titta”.
Enligt analys av streamingtjänster (2025) är upp till 8% av misslyckade uppspelningsstarter relaterade till DRM-fel. Av dessa är 60% utgångna licenser, 25% — enhetsinkompatibilitet och 15% — nätverksfel vid nyckelbegäran. Automatiskt försök efter 5 sekunder löser 40% av nätverksfelen.
Vanliga frågor
Tekniskt möjligt på enheter med Widevine L3 (mjukvaruskydd), där nyckeln kan extraheras från minnet. På L1 och FairPlay med Secure Enclave är kringgående extremt svårt — fysisk åtkomst till TEE krävs. Innehållsstudior riktar in sig på L1-enheter för premiuminnehåll.
Troligtvis är enheten inte certifierad för Widevine L1 och använder L3. Netflix begränsar kvaliteten till 540p på L3-enheter. Kontrollera Widevine-nivån via DRM Info-appen från Google Play. Flaggskeppsenheter som Samsung, Pixel och OnePlus har vanligtvis L1.
Använd Multi-DRM: Widevine för Android, FairPlay för Apple, PlayReady för Windows. Tjänster som Axinom eller Vualto tillhandahåller ett enhetligt API för alla tre DRM. Innehållet krypteras en gång via CENC och DRM-valet sker automatiskt på klientsidan.
På iOS använder du FairPlays persistent keys via AVContentKeySession. På Android — Widevine Offline License via ExoPlayer OfflineLicenseHelper. Nyckeln sparas lokalt i Keychain (iOS) eller KeyStore (Android) med begränsad giltighetstid — vanligtvis 7 till 30 dagar.
KID (Key ID) — en unik 16-byte identifierare för krypteringsnyckeln i CENC-manifestet. Varje KID är bunden till ett specifikt innehållssegment (till exempel ett 10-minuters segment av en film). Licensservern använder KID för att hitta motsvarande nyckel i sin databas. En film kan innehålla upp till 20 olika KID för olika delar.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också