¿Cómo proteger mis contenidos con claves firmadas?

Las claves firmadas son una alternativa a Control de dominios para evitar que tus vídeos se incrusten donde no quieres. Mientras que la seguridad del Control de Dominio se basa en la verificación de la información de referencia enviada por el agente de usuario que incrusta, la seguridad firmada por el usuario se basa en la verificación de una firma añadida a su código incrustado que se genera utilizando una clave de firma secreta compartida por usted y Dacast.

Normalmente, las claves firmadas se utilizan en aplicaciones que generan contenido HTML de forma dinámica. Las claves firmadas le permiten establecer un tiempo de caducidad para su código de incrustación, de modo que un código de incrustación determinado sólo sea válido durante un tiempo limitado en el futuro. Cuando tu aplicación genera un documento HTML con un vídeo incrustado, también genera un código de incrustación firmado, específico para esa página, que sólo es válido durante un breve periodo de tiempo en el futuro. Si sus páginas son estáticas, no puede utilizar claves firmadas, ya que la clave debe generarse en tiempo real.

Utilización

Normalmente, cuando incrusta un vídeo de Dacast en su sitio, sólo tiene que utilizar el código de incrustación generado por Dacast para hacerlo. Es algo parecido a esto:

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

Al utilizar Signed Keys, se sigue utilizando el mismo código de incrustación, pero se añade un parámetro adicional al atributo src del iframe. Es algo parecido a esto:

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

El parámetro uss_token es generado dinámicamente por su aplicación utilizando su clave secreta de firma, y Dacast no servirá el vídeo a menos que el token sea válido y no haya caducado. La seguridad firmada por el usuario también se aplica a las incrustaciones de listas de reproducción.

Activación de claves firmadas

Las claves firmadas pueden activarse en la sección de configuración de seguridad de su página de configuración. Tenga en cuenta que también tendrá que generar una clave de firma en la misma página antes de que Dacast aplique comprobaciones de seguridad firmadas por el usuario a sus vídeos:

Claves firmadas dacast

Generación de URL de códigos incrustados firmados

Existen tres formas de generar el parámetro uss_token para añadirlo al código de incrustación.

La primera sólo funciona para vídeos individuales (no listas de reproducción) y es específica del vídeo que se está incrustando. Es decir, un token generado para un vídeo concreto no puede utilizarse para otros vídeos de su propiedad.

El segundo método genera un token que será válido (hasta que caduque) para cualquiera de los vídeos que poseas. Esto puede ser útil si está creando una página que incrusta varios vídeos diferentes y no desea generar tokens específicos de vídeo para cada incrustación. También es el método requerido si está incrustando una lista de reproducción.

La tercera es similar a la primera, salvo que también requiere que especifiques el formato (vídeo/descarga/fuente) para que puedas permitir sólo la reproducción pero no las descargas con ese token.

 

Fichas específicas de vídeo

Para generar un token USS, primero hay que elegir una fecha de caducidad para el token. (Tenga en cuenta que lo ideal es que la hora de su sistema esté sincronizada mediante NTP o un protocolo similar para que su sistema piense que es la misma hora que la del sistema de Dacast). La hora que elijas debe estar en UTC, y convertida a una cadena con el formato:

YYYYMMDDHHMMSS

Así, por ejemplo, el 10 de julio de 2021, 07:18:22 PM (UTC) se expresaría como:

20210710191822

El parámetro uss_token se genera entonces como la siguiente cadena:

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

donde `<fecha_vencimiento>` es la cadena de fecha y hora generada anteriormente, `<content_id>` es el ID de contenido del vídeo que está incrustando, y `<llave_de_firma>` es su clave de firma que se encuentra en la página de configuración de Dacast. MD5() es una función que calcula el hash MD5 de una cadena dada.

 

Tokens específicos de usuario

Este tipo de token no requiere el identificador de vídeo y será válido para cualquiera de tus vídeos, así como para tus listas de reproducción. El método para construir el token es similar al de los tokens específicos de vídeo. El token final se calcula como:

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

Las diferencias son que ahora el token lleva el prefijo “3.” y que el identificador del vídeo ya no se incluye en la cadena hash.

Tokens específicos de formato

Similar al token específico de vídeo, excepto que requiere que especifique uno de vídeo/descarga/fuente, dependiendo de lo que desee permitir:

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

o

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


Ejemplos de idiomas
He aquí algunos ejemplos de generación de tokens de seguridad firmados por el usuario en algunos lenguajes comunes del lado del servidor:

Ruby

	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#

No tenemos un ejemplo completo de código C# en este momento ya que no somos ingenieros .NET. Sin embargo, el problema principal es crear un hash MD5 de la cadena. Hay un artículo aquí que explica exactamente cómo hacerlo: ¿Cómo calculo un hash MD5 a partir de una cadena?

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.