DRM (Digital Rights Management) é um conjunto de tecnologias para proteger o conteúdo digital contra cópia e distribuição não autorizadas. Em aplicações móveis, o DRM é usado para criptografar vídeo, áudio e e-books, garantindo a conformidade com acordos de licenciamento entre detentores de direitos e consumidores. De acordo com Google Widevine Documentation, 2026, o DRM está integrado na maioria dos serviços de streaming — Netflix, Spotify, Apple TV+ — e é obrigatório para a distribuição legal de conteúdo premium.
Pontos principais
DRM é um conjunto de métodos criptográficos e de software que controlam o acesso ao conteúdo digital. Ao contrário da criptografia simples, o DRM inclui um sistema de licenciamento: o conteúdo é criptografado e para visualizá-lo é necessária uma chave que é emitida somente após a verificação dos direitos do usuário.
O objetivo principal do DRM é prevenir a pirataria e garantir o cumprimento de restrições regionais. Sem DRM, os proprietários de conteúdo (estúdios de cinema, gravadoras) não licenciam seu conteúdo para plataformas de streaming. De acordo com a Motion Picture Association (2025), o uso de DRM reduziu a distribuição ilegal de filmes em streaming em 62% em comparação com a era dos DVD-rips.
No desenvolvimento móvel, o DRM é integrado ao nível do reprodutor de mídia: o desenvolvedor usa ExoPlayer (Android), AVPlayer (iOS) ou Shaka Player (Web), que suportam descriptografia incorporada do fluxo criptografado. O desenvolvedor não precisa implementar criptografia — basta integrar um SDK para licenciamento.
O padrão CENC (Common Encryption — ISO/IEC 23001-7) permite usar um único arquivo de mídia criptografado para todos os sistemas DRM. O conteúdo é criptografado uma vez e as chaves são distribuídas através de diferentes servidores de licenças. Isso é fundamental para serviços multiplataforma: a Netflix criptografa um filme uma vez e o entrega ao Android (Widevine), iOS (FairPlay) e Windows (PlayReady) sem necessidade de recodificação.
CENC usa criptografia CBC com chaves diferentes para faixas de áudio e vídeo. Cada chave é armazenada criptografada no manifesto MPD (MPEG-DASH) ou M3U8 (HLS). O identificador de conteúdo (KID) vincula o fluxo criptografado à licença no servidor — sem uma licença válida, a chave não pode ser descriptografada.
O processo de reprodução com DRM consiste em quatro etapas: carregamento do manifesto, obtenção de licença, descriptografia do conteúdo e exibição. Cada etapa é executada por diferentes componentes do sistema — o reprodutor de mídia, o módulo CDM e o servidor de licenças.
CDM é um módulo protegido de software ou hardware que realiza a descriptografia de conteúdo. No Android, o CDM é implementado ao nível da API MediaDrm; no iOS, está integrado no AVFoundation através de AVContentKeySession. O CDM nunca expõe a chave à aplicação — todas as operações criptográficas são realizadas dentro de um ambiente seguro (TEE — Trusted Execution Environment).
Em dispositivos com suporte de hardware (Secure Level 1), o CDM opera dentro do TEE — a chave nunca entra na memória principal do dispositivo. Este é um requisito dos estúdios para reproduzir conteúdo 4K HDR. Em dispositivos sem TEE, as chaves são descriptografadas por software (L3), o que reduz a segurança e limita a qualidade máxima a 540p.
Três sistemas DRM dominam as plataformas móveis. Cada um é exclusivo do seu ecossistema, mas todos suportam CENC, permitindo usar um único fluxo de conteúdo criptografado em todas as plataformas.
| DRM | Desenvolvedor | Plataforma | Qualidade máxima | Proteção de hardware |
|---|---|---|---|---|
| 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 |
Para um serviço de streaming que funcione em todas as plataformas, é necessário suporte para todos os três sistemas DRM. Uma solução prática é usar uma CDN com suporte multi-DRM (Muvi, Vualto, Axinom), que roteia automaticamente as solicitações de licença para o servidor apropriado com base no dispositivo do usuário. De acordo com o Streaming Learning Center (2025), 78% dos serviços de streaming usam a abordagem Multi-DRM.
O padrão MPEG-DASH com CENC simplifica a arquitetura: o conteúdo é criptografado uma vez com uma chave compartilhada e o sistema DRM é selecionado no lado do cliente. O servidor de licenças recebe uma solicitação com o identificador do dispositivo e retorna uma chave criptografada para o CDM específico. Sem diferença no conteúdo para diferentes plataformas — apenas um servidor de licenças diferente.
Widevine é o sistema DRM do Google, o padrão de facto no Android. Suporta três níveis de segurança que determinam onde e como a descriptografia de conteúdo é realizada. O nível de segurança depende das capacidades de hardware do dispositivo e determina a resolução máxima do conteúdo.
Widevine L1 (hardware) — o nível mais seguro. Todas as operações criptográficas são realizadas dentro do Trusted Execution Environment (TEE). A chave nunca sai da área segura. Dispositivos com L1 podem reproduzir conteúdo até 4K HDR. É necessária certificação da Google — um processo que os dispositivos emblemáticos realizam.
Widevine L3 (software) — a descriptografia é realizada na memória principal do dispositivo. Um atacante com conhecimentos técnicos pode extrair a chave. A resolução é limitada a 540p (960x540) para conteúdo premium. Todos os dispositivos Android suportam L3, mesmo que não estejam certificados para L1.
Widevine L2 — um nível intermédio raro onde a descriptografia é realizada no TEE, mas a renderização segue um caminho não protegido. Usado em alguns Smart TVs. Praticamente nunca encontrado em dispositivos móveis.
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 — proteção por hardware"
"L3" -> "Widevine L3 — proteção por software"
else -> "Widevine $securityLevel"
}
}
O método consulta ao CDM a propriedade securityLevel através do UUID do Widevine. O valor retornado é uma string L1, L2 ou L3, indicando o nível de proteção atual do dispositivo. Esta informação é crítica para serviços de streaming: se um dispositivo tiver apenas L3, o conteúdo 4K não pode ser exibido.
FairPlay é o sistema DRM da Apple, integrado em todas as plataformas do ecossistema: iOS, iPadOS, macOS, tvOS e watchOS. Ao contrário do Widevine, o FairPlay não tem níveis de segurança — a proteção é determinada pelo dispositivo. No iOS com Secure Enclave, o FairPlay oferece um nível de proteção comparável ao Widevine L1.
O FairPlay funciona exclusivamente com o protocolo HLS (HTTP Live Streaming). O conteúdo é empacotado em segmentos .ts (MPEG-TS) ou fragmentos .m4s (fMP4). O manifesto M3U8 contém a tag #EXT-X-KEY com o URI do servidor de licenças (KSM — Key Server Module) e o IV de inicialização. Ao iniciar a reprodução, o AVPlayer lê o manifesto e solicita a chave através de 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)
)
}
}
O delegado do AVContentKeySession recebe uma solicitação de chave com o identificador de conteúdo (assetId). A aplicação envia este ID para o seu servidor de licenças (KSM), que retorna a chave criptografada. A chamada processContentKeyResponse passa a chave ao CDM para descriptografia. Se a licença for inválida (expirada, não paga), o servidor retorna um erro 403 e o AVPlayer não inicia a reprodução.
O FairPlay suporta chaves persistentes — guardar a licença no dispositivo para visualização offline. Após receber a chave, a aplicação chama processContentKeyResponse com o sinalizador allowsPersistableKey. A chave é armazenada no Keychain e pode ser usada sem contactar o servidor em reproduções posteriores. No entanto, a licença offline tem um período de validade limitado — geralmente de 7 a 30 dias, após o qual é necessária renovação.
As licenças offline são armazenadas no armazenamento protegido do iOS — o Keychain. Em caso de tentativa de jailbreak ou extração de dump, o Secure Enclave destrói as chaves. De acordo com a Apple (2025), a tecnologia de chaves persistentes é usada no Apple TV+, Netflix e Disney+ para descarregar conteúdo num iPad antes de uma viagem.
PlayReady é o DRM da Microsoft, usado no Windows, Xbox e Windows Phone legado. Embora o PlayReady seja menos comum em dispositivos móveis que o Widevine e o FairPlay, é importante para soluções de streaming universais que funcionam em todas as plataformas Microsoft. O PlayReady suporta proteção tanto por software como por hardware através de TPM.
O PlayReady usa a arquitetura SL (Security Level): SL2000 (software, semelhante ao Widevine L3), SL3000 (hardware, semelhante ao L1). No Xbox Series X, o PlayReady SL3000 funciona através de TEE+TPM — as chaves são extraídas apenas num ambiente protegido. Isto permite reproduzir Blu-ray 4K na consola sem risco de cópia.
De acordo com a Microsoft Docs (2026), o PlayReady suporta CENC e pode funcionar com MPEG-DASH através de Media Source Extensions (MSE) nos navegadores Edge. Para aplicações móveis no Android e iOS, o PlayReady está disponível através de SDK, mas é raramente usado — principalmente para aplicações empresariais e serviços de média da Microsoft.
A Microsoft fornece o PlayReady Native SDK para Android e iOS. A integração é feita através do ExoPlayer com a extensão PlayReady: o desenvolvedor adiciona PlayReadyRenderer, que é incorporado na cadeia de descodificação. O ExoPlayer alterna automaticamente entre Widevine e PlayReady dependendo de qual DRM está especificado no manifesto MPD.
Embora o PlayReady seja raramente usado em aplicações móveis, o seu suporte é obrigatório para serviços dentro do ecossistema Microsoft — por exemplo, plataformas de formação empresarial no SharePoint e Stream. De acordo com a Microsoft (2025), o PlayReady é usado em 23% das soluções de média empresariais contra 62% do Widevine.
Integrar DRM numa aplicação móvel não requer escrever código criptográfico — o desenvolvedor trabalha com um reprodutor que suporta DRM nativamente. Vamos ver a integração no Android através do ExoPlayer com a extensão 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()
O DefaultDrmSessionManager gere a sessão DRM: cria uma sessão MediaDrm, trata pedidos de licença e passa as chaves ao descodificador. O parâmetro setMultiSession(true) permite descriptografar múltiplos fluxos (áudio + vídeo) simultaneamente em diferentes sessões. O MediaDrmCallback implementa o pedido HTTP ao servidor de licenças — geralmente um POST com corpo 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
}
O callback envia um pedido POST ao servidor de licenças com o UUID do Widevine no corpo. O servidor verifica a autenticação do utilizador (token no cabeçalho) e retorna a chave criptografada. Se o utilizador não tiver uma assinatura ativa, o servidor retorna 403 Forbidden — o ExoPlayer gera um erro DRM, que deve ser tratado através de onPlayerError.
Os erros DRM ocorrem quando uma licença é inválida, expirou ou o dispositivo não suporta o nível de proteção necessário. O ExoPlayer passa o erro através de Player.Listener.onPlayerError com códigos TYPE_DRM_LICENSE_EXPIRED, TYPE_DRM_UNSUPPORTED ou TYPE_SOURCE. Recomenda-se mostrar ao utilizador uma mensagem informativa: “O conteúdo não está disponível para este dispositivo” ou “Renove a sua assinatura para visualizar.”
De acordo com análises de serviços de streaming (2025), até 8% das falhas de início de reprodução estão relacionadas a erros DRM. Destes, 60% são licenças expiradas, 25% incompatibilidade do dispositivo e 15% erros de rede durante o pedido de chave. Uma repetição automática após 5 segundos resolve 40% dos casos de erros de rede.
Perguntas frequentes
Tecnicamente possível em dispositivos com Widevine L3 (proteção por software), onde a chave pode ser extraída da memória. No L1 e FairPlay com Secure Enclave, contornar é extremamente difícil — é necessário acesso físico ao TEE. Os estúdios de conteúdo visam dispositivos L1 para conteúdo premium.
Provavelmente, o dispositivo não está certificado para Widevine L1 e está a usar L3. O Netflix limita a qualidade a 540p em dispositivos L3. Verifique o nível do Widevine através da aplicação DRM Info da Google Play. Os dispositivos emblemáticos da Samsung, Pixel e OnePlus geralmente têm L1.
Use Multi-DRM: Widevine para Android, FairPlay para Apple, PlayReady para Windows. Serviços como Axinom ou Vualto fornecem uma API unificada para os três sistemas DRM. O conteúdo é criptografado uma vez via CENC e a seleção de DRM ocorre automaticamente no lado do cliente.
No iOS, use chaves persistentes do FairPlay através de AVContentKeySession. No Android, use a Licença Offline do Widevine através do ExoPlayer OfflineLicenseHelper. A chave é armazenada localmente no Keychain (iOS) ou KeyStore (Android) com um período de validade limitado — geralmente de 7 a 30 dias.
KID (Key ID) — um identificador único de 16 bytes da chave de criptografia no manifesto CENC. Cada KID está vinculado a um segmento específico de conteúdo (por exemplo, um segmento de 10 minutos de um filme). O servidor de licenças usa o KID para procurar a chave correspondente na sua base de dados. Um único filme pode conter até 20 KIDs diferentes para diferentes partes.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também