IDs de chave e chave (KIDs)
Cada arquivo de mídia protegido pelo PlayReady tem um Objeto PlayReady (PRO), que contém várias informações de que o PlayReady precisa. Isso está localizado no cabeçalho de conteúdo do arquivo que, por exemplo, também pode conter metadados para as faixas de vídeo e áudio.
Dentro de cada PRO há um Cabeçalho PlayReady, que fornece a um cliente as informações necessárias para localizar ou adquirir uma licença para o conteúdo no qual ele está armazenado. O Cabeçalho PlayReady tem esta aparência:
<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.2.0.0">
<DATA>
<PROTECTINFO>
<KIDS>
<KID ALGID="AESCTR" CHECKSUM="xNvWVxoWk04=" VALUE="0IbHou/5s0yzM80yOkKEpQ=="></KID>
<KID ALGID="AESCTR" CHECKSUM="GnKaQIRacPU=" VALUE="/qgG2xbs4k2SKCxx6bhWqw=="></KID>
</KIDS>
</PROTECTINFO>
<LA_URL>https://test.playready.microsoft.com/service/rightsmanager.asmx</LA_URL>
</DATA>
</WRMHEADER>
A parte que nos interessa é o <KIDS>
elemento, que contém um ou mais <KID>
elementos. Um KID (ID de chave) contém um GUID (identificador global exclusivo) que o cliente usa para solicitar ao Servidor uma chave correspondente e um ALGID, que é usado para descriptografar o arquivo. O KID é público, pois está contido no PRO, mas a chave em si é um segredo para o serviço, e a relação entre chave e KID é conhecida apenas pelo serviço.
Gerar uma chave e criptografar o conteúdo
As chaves de criptografia de conteúdo em sistemas PlayReady são chaves AES-128 CTR e AES-128 CBC. O serviço que criptografa o conteúdo gera um novo KID e uma nova chave de conteúdo. O KID é inserido no PRO e os quadros de vídeo e áudio do conteúdo são criptografados com a chave de conteúdo. A imagem a seguir mostra como uma chave é gerada e usada para criptografar o conteúdo.
Há duas maneiras de gerar um KID e uma chave, incluindo:
- Usando um sistema de gerenciamento de chaves (KMS), em que o serviço gera aleatoriamente cada KID e o valor da chave e os armazena, e pode simplesmente pesquisar o valor da chave que corresponde ao KID fornecido pelo cliente.
- Usando o mecanismo de Semente de Chave PlayReady . Com esse mecanismo, o serviço determina um valor constante chamado semente de chave (um valor aleatório de 30 bytes) e, para cada parte do conteúdo que requer uma chave, gera um KID aleatório. Usando o SDK do Servidor, você pode gerar uma chave fornecendo os 128 bits da chave ou a semente de chave e KID. A chave será inferida por um algoritmo PlayReady especificado aqui.
Não importa como você gere a chave, você deve ser capaz de verificar se ela corresponde ao KID correto e, em seguida, criptografar o conteúdo.
Entregar uma licença para o conteúdo
Quando um cliente faz uma solicitação de licença, ele envia o Cabeçalho PlayReady do conteúdo para o emissor da licença. O emissor de licença extrai o KID e determina o valor de chave correspondente, usando um dos métodos descritos acima: se ele usa o mecanismo de semente de chave, ele apenas regenera a chave com base no KID e na semente da chave. Em seguida, ele gera uma licença, incluindo essa chave, que ela envia de volta para o cliente em uma resposta de licença.
Por exemplo, digamos que você tenha um arquivo de vídeo. O empacotador para esse conteúdo gera um KID 123
aleatório, que ele insere no Cabeçalho PlayReady do arquivo. O empacotador também gera um valor ABC
de chave aleatória para corresponder ao KID 123
e armazena ambos no KMS. O empacotador solicita ao KMS a chave correta para criptografar o arquivo e criptografa o arquivo com a chaveABC
. Quando o cliente tenta reproduzir o arquivo, o cliente solicita ao emissor de licença uma licença que corresponde ao KID 123
. O emissor de licença pesquisa o KID no KMS e responde com uma licença, incluindo a chaveABC
, que permite que o cliente desbloqueie o arquivo e o cliente o assista.
Observação
A licença enviada pelo emissor de licença para o cliente (em nosso exemplo, a licença que contém a chave ABC
) é criptografada; um invasor não pode interceptar o valor da chave.
A chave usada para proteger o arquivo de mídia e a chave na licença são as mesmas; portanto, o empacotador de conteúdo e o emissor da licença devem ser capazes de recuperar ou gerar exatamente a mesma chave para um arquivo de mídia especificado. Para fazer isso, se você estiver usando uma semente de chave para gerar chaves, deverá compartilhá-la entre o empacotador de conteúdo e o emissor da licença.
Compartilhando chaves entre arquivos ou faixas
Assim como uma chave real pode desbloquear mais de uma porta, tecnicamente é possível usar uma chave PlayReady para desbloquear várias faixas em um arquivo ou até mesmo vários arquivos em uma coleção de ativos. Durante o processo de empacotamento, o empacotador de conteúdo pode especificar o mesmo identificador de chave para várias faixas ou vários arquivos de mídia, e a mesma chave é usada para todos eles.
Por exemplo, com um ativo de vídeo de várias qualidades com faixas de vídeo 4K, HD e SD e várias faixas de áudio, o criptografador tem a flexibilidade de definir uma chave por faixa ou uma chave para todas as faixas.
Os clientes precisarão de uma licença para cada uma das chaves que têm o direito de descriptografar. Observe que a entrega de várias licenças pode ser feita por um Servidor de Licença em uma única resposta de licença.
Em um único ativo com várias faixas, a decisão entre uma chave para todas as faixas ou uma chave para cada faixa é feita pelo serviço que gerencia o conteúdo e com base nos seguintes critérios:
- Mais chaves trazem mais complexidade, mas permite que você especifique no momento da entrega da licença o que acompanha o serviço que deseja permitir que um cliente específico seja descriptografado.
- Menos chaves são menos complexas, mas não permite que você especifique no momento da entrega da licença o que rastreia o serviço que deseja permitir que um cliente específico seja descriptografado.
- Alguns clientes podem ter a limitação de não dar suporte a várias chaves para um único ativo.
Observação
Embora as chaves PlayReady possam desbloquear mais de um arquivo de mídia digital, a Microsoft é fortemente contra isso. Usar chaves exclusivas em todos os arquivos fornece maior segurança do que proteger arquivos com a mesma chave.
Empilhando licenças em uma resposta de licença
Uma única resposta de licença também pode levar várias licenças e, portanto, várias chaves para desbloquear vários arquivos ou faixas em uma transação. Isso é mais eficiente do que criar várias respostas para várias licenças, pois envolve apenas uma transação. Isso pode ser útil para cenários diferentes:
- Um arquivo de mídia é criptografado usando várias chaves. Por exemplo, a faixa de vídeo é criptografada usando o Key1 e a faixa de áudio é criptografada usando Key2. Quando um cliente solicita uma licença para KID1, o Servidor de Licença emite uma resposta de licença, incluindo licenças para KID1 e KID2, para que o cliente tenha todas as chaves para descriptografar as faixas de vídeo e áudio do arquivo.
- Cada música em um álbum é criptografada usando uma chave diferente, mas um cliente adquiriu os direitos para todos eles. Quando o cliente começa a tocar a primeira música, o Servidor de Licença emite uma resposta de licença, incluindo uma licença para cada música do álbum, para que o cliente tenha todas as chaves necessárias para tocar o álbum inteiro perfeitamente.
- Espera-se que a chave de um canal na TV ao vivo mude a cada 24 horas. Quando a reprodução é iniciada, o Servidor envia uma resposta de licença, incluindo a licença da chave atual, mas também uma licença com a próxima chave, portanto, quando a chave for alterada, o cliente já terá a próxima chave e a alteração ocorrerá perfeitamente.