Como proteger o meu conteúdo com chaves assinadas?

As chaves assinadas são uma alternativa ao Controlo de domínio para evitar que os seus vídeos sejam incorporados onde não quer que sejam. Enquanto a segurança do Controlo de Domínio se baseia na verificação das informações do referenciador enviadas pelo agente do utilizador de incorporação, uma segurança assinada pelo utilizador baseia-se na verificação de uma assinatura anexada ao seu código de incorporação que é gerada utilizando uma chave de assinatura secreta partilhada por si e pela Dacast.

Normalmente, as chaves assinadas destinam-se a ser utilizadas em aplicações que estão a gerar dinamicamente conteúdo HTML. As Chaves Assinadas permitem-lhe definir um tempo de expiração para o seu código de incorporação, de modo a que um determinado código de incorporação seja válido apenas durante um período limitado no futuro. Quando a sua aplicação gera um documento HTML com um vídeo incorporado, também gera um código de incorporação assinado, específico para essa página, que só é válido por um curto período de tempo no futuro. Se as suas páginas forem estáticas, não pode utilizar chaves assinadas, uma vez que a chave tem de ser gerada em tempo real.

Utilização

Normalmente, quando incorpora um vídeo Dacast no seu sítio, basta utilizar o código de incorporação gerado pelo Dacast para o fazer. É mais ou menos assim:

<iframe src="https://iframe.dacast.com/vod/3b67c4a9-3886-4eb1/027495c1-9ca8-cbed”………</iframe>

Ao utilizar Chaves assinadas, continua a utilizar o mesmo código de incorporação, no entanto, é acrescentado um parâmetro adicional ao atributo src no iframe. É mais ou menos assim:

<iframe src="https://iframe.dacast.com/vod/3b67c4a9-3886-4eb1/027495c1-9ca8-cbed/?uss_token=S3Le_oSTGNSyBB9bdxetqsdqsd”………</iframe>

O parâmetro uss_token é gerado dinamicamente pela sua aplicação, utilizando a sua chave de assinatura secreta, e o Dacast não apresentará o vídeo a menos que o token seja válido e não tenha expirado. A segurança assinada pelo utilizador também se aplica às incorporações de listas de reprodução.

Ativação de chaves assinadas

As chaves assinadas podem ser activadas na secção secção de definições de segurança da sua página de definições. Tenha em atenção que também terá de gerar uma chave de assinatura na mesma página antes de o Dacast aplicar verificações de segurança assinadas pelo utilizador aos seus vídeos:

Chaves assinadas com dacast

Geração de URLs de código incorporado assinados

Existem três maneiras de gerar o parâmetro uss_token para anexar ao seu código incorporado.

A primeira funciona apenas para vídeos individuais (não para listas de reprodução) e é específica para o vídeo que está a ser incorporado. Ou seja, um token gerado para um determinado vídeo não pode ser utilizado para outros vídeos que possua.

O segundo método gera um token que será válido (até expirar) para qualquer um dos vídeos que possui. Isto pode ser útil se estiver a criar uma página que incorpore vários vídeos diferentes e não quiser gerar tokens específicos de vídeo para cada incorporação. É também o método necessário se estiver a incorporar uma lista de reprodução.

A terceira é semelhante à primeira, exceto que também requer que especifique o formato (vídeo/transferência/fonte) para que possa permitir apenas a reprodução mas não as transferências com esse token.

 

Tokens específicos de vídeo

Para gerar um token USS, começa por escolher um tempo de expiração para o token. Normalmente, deve escolher uma hora alguns minutos mais ou menos no futuro (note que, idealmente, a hora do seu sistema deve ser sincronizada utilizando NTP ou um protocolo semelhante para que o seu sistema pense que é a mesma hora que o sistema do Dacast). A hora escolhida deve estar em UTC e ser convertida numa cadeia de caracteres com o formato:

YYYYMMDDHHMMSS

Assim, por exemplo, o dia 10 de julho de 2021, 07:18:22 PM (UTC) seria expresso como:

20210710191822

O parâmetro uss_token é então gerado como a seguinte cadeia de caracteres:

2.<expiry_timestamp>.MD5(<content_id>:<signing_key>:<expiry_timestamp>)

em que `<carimbo de data/hora de expiração>` é a cadeia de carimbo de data/hora gerada acima, `<id_conteúdo>` é o Content ID do vídeo que está a incorporar, e `<chave_de_assinatura>` é a sua chave de assinatura que se encontra na página de definições do Dacast. MD5() é uma função que calcula o hash MD5 de uma determinada cadeia de caracteres.

 

Tokens específicos do utilizador

Este tipo de token não requer o ID do vídeo e será válido para qualquer um dos seus vídeos, bem como para as suas listas de reprodução. O método de construção do token é semelhante ao dos tokens específicos de vídeo. A ficha final é calculada como:

3.<expiry_timestamp>.MD5(<signing_key>:<expiry_timestamp>)

As diferenças são que o token é agora prefixado com ‘3.’ e o ID do vídeo já não está incluído na cadeia de hash.

Tokens específicos de formato

Semelhante ao token específico de vídeo, exceto que requer que especifique um dos formatos vídeo/download/fonte, dependendo do que pretende permitir:

4.<expiry_timestamp>.MD5(video:<content_id>:<signing_key>:<expiry_timestamp>)

ou

4.<expiry_timestamp>.MD5(download:<content_id>:<signing_key>:<expiry_timestamp>)


Exemplos de línguas
Seguem-se alguns exemplos de geração de tokens de segurança assinados pelo utilizador em algumas linguagens comuns do lado do servidor:

Rubi

	require 'digest'

	# Expire in 2 minutes time
	expiry_timestamp = (Time.now.utc + 120).strftime("%Y%m%d%H%M%S")
	signing_key = "000033337777aaaa222233334444bbbb"
	video_id = 920344

	# Generate a video-specific token
	signature_vs = Digest::MD5.hexdigest(
	   "#{video_id}:#{signing_key}:#{expiry_timestamp}"
)
token_vs = "2.#{#{signing_key}".#{signature_timestamp}

# Generate a user-specific token
signature_us = Digest::MD5.hexdigest(
   "#{signing_key}:#{expiry_timestamp}"
   )
   token_us = "3.#{expiry_timestamp}.#{signature_us}"

 # Generate a video- and format-specific token
 # This allows only playback, not downloads
 signature_fs = Digest::MD5.hexdigest(
    "video:#{video_id}:#{signing_key}:#{expiry_timestamp}"
)
token_fs = "4.#{expiry_timestamp}.#{signature_fs}"

# This allows only download, not playback
signature_fs = Digest::MD5.hexdigest(
   "download:#{video_id}:#{signing_key}:#{expiry_timestamp}"
)
token_fs = "4.#{expiry.timestamp}.#{signature_fs}""

Java

// This example requires the apache common-codec library
	//	(http://commons.apache.org.codec)
	import org.apache.commons.codec.digest.DigestUtils;

	import java.text.SimpleDateFormat;
	import java.util.Date;
	import java.util.Timezone;

	public class DacastUssTokens {

		public static void main(String)[] args) {
			SimpleDateFormat dateFormat = new SimpleDateFormat("yyyMMddHHmmss");
			dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

			String expiryTimestamp = dateformat.format(
					new Date(System.currentTimeMillis() + (120 * 1000)));
			String signingKey = "000033337777aaaa222233334444bbbb";
			int videoID = 920344;

			// Generate a video-specific token
			String signatureVs = DigestUtils.md5Hex(
					String.format("%d:%s:%s", videoId, signingKey, expiryTimestamp));
			String tokenVs = String.format("2.%s.%s", expiryTimestamp, signatureVs);

			// Generate a user-specific token
			String signaturesUS = DigestUtils.md5Hex(
					String.format("%s:%s", signingkey, expiryTimestamp));
			String tokenUs = String.format("3.%s.%s", expiryTimestamp, signatureUs);

			// Generate a video- and format-specfic token
			// This allows only playback, not downloads
			String signatureFs = DigestUtils.md5Hes(
					String.format("%s:%s:%s", "video", videoId, signingKey, expiryTimestamp
			String tokenFs = String.format("4.%s.%s", expiryTimestamp, signatureFs);

			 // This allows only downloads, not playback
			 String signatureFs = DigestUtils.md5Hex(
			 		String.format("%s:%d:%s:%s", "video", videoId, signingKey, expiryTime
			 String tokenFs = String.format("4.%s.%s", expiryTimestamp, signatureFs);
	}
}

PHP
<?php
		# Epire in 2 minutes time
		$time = new DateTime('now', new DateTimeZone('UTC'));
		$time -> modify("+2 minutes");
		$expiry_timestamp = $time -> format{'ymdHis'};
		$signing_key = "000033337777aaaa222233334444bbbb";
		$video_id = 920344;

		# generate  video-specific token
		$signature_vs = md5("{expiry_timestamp}.{$signature_vs}");
		$token_vs = "2.{$expiry_timestamp}.{$signature_vs}";

		# Generate a user-specific token
		$signature_us = md5("{signing_key}:{$signature_timestamp}";
		$token_us = "3.{$expiry_timestamp}.{$signature_us}";

		# Generate a video- and format-specific token
		# This allows only playback, not downloads
		$signature_fs = md5("video_id}:{$signing_key}:{$sexpiry_timestamp}");
		$token_fs = "4.{$expiry_timestamp}.{$signature_fs}";

		# This allows only downloads, not playback
		$signature_fs = md5("download:{$video_id}:{signing_key}:{$expiry_timestamp}";
		$token_fs = "4.{$expiry_timestamp}.{$signature_fs}";
?>

C#

Neste momento, não temos um exemplo completo de código C#, pois não somos engenheiros de .NET. No entanto, o problema principal é criar um hash MD5 da cadeia de caracteres. Há um artigo aqui que explica exatamente como fazer isso: Como calcular um hash MD5 a partir de uma cadeia de caracteres?

Harmonie Duhamel

Harmonie is a Senior digital marketer with over 6 years in the Tech Industry. She has a strong marketing and sales background and loves to work in multilingual environments.