Le chiavi firmate sono un’alternativa a Controllo del dominio per evitare che i video vengano incorporati dove non si vuole. Mentre la sicurezza del controllo del dominio si basa sulla verifica delle informazioni sul referrer inviate dall’agente utente che effettua l’incorporamento, la sicurezza firmata dall’utente si basa sulla verifica di una firma apposta al codice incorporato, generata utilizzando una chiave di firma segreta condivisa dall’utente e da Dacast.
In genere, le chiavi firmate sono destinate all’uso in applicazioni che generano dinamicamente contenuti HTML. Le chiavi firmate consentono di impostare un tempo di scadenza per il codice embed, in modo che un particolare codice embed sia valido solo per un periodo limitato nel futuro. Quando l’applicazione genera un documento HTML con un video incorporato, genera anche un codice incorporato firmato, specifico per quella pagina, valido solo per un breve periodo di tempo nel futuro. Se le pagine sono statiche, non è possibile utilizzare le chiavi firmate, poiché la chiave deve essere generata in tempo reale.
Utilizzo
Normalmente, quando si incorpora un video Dacast sul proprio sito, si utilizza semplicemente il codice di incorporamento generato da Dacast. L’aspetto è simile a questo:
<iframe src="https://iframe.dacast.com/vod/3b67c4a9-3886-4eb1/027495c1-9ca8-cbed”………</iframe>
Quando si utilizzano le chiavi firmate, si continua a utilizzare lo stesso codice embed, ma un parametro aggiuntivo viene aggiunto all’attributo src dell’iframe. L’aspetto è simile a questo:
<iframe src="https://iframe.dacast.com/vod/3b67c4a9-3886-4eb1/027495c1-9ca8-cbed/?uss_token=S3Le_oSTGNSyBB9bdxetqsdqsd”………</iframe>
Il parametro uss_token viene generato dinamicamente dall’applicazione utilizzando la chiave di firma segreta e Dacast non servirà il video se il token non è valido e non è scaduto. La sicurezza firmata dall’utente si applica anche agli embed delle playlist.
Abilitazione delle chiavi firmate
Le chiavi firmate possono essere abilitate nella sezione sezione Impostazioni di sicurezza della pagina delle impostazioni. Si noti che è necessario generare una chiave di firma nella stessa pagina prima che Dacast applichi i controlli di sicurezza firmati dall’utente ai video:
Generazione di URL di codice embed firmati
Esistono tre modi di generare il parametro uss_token da aggiungere al codice incorporato.
Il primo funziona solo per i singoli video (non per le playlist) ed è specifico per il video incorporato. In altre parole, un token generato per un determinato video non può essere utilizzato per altri video di vostra proprietà.
Il secondo metodo genera un token che sarà valido (fino alla sua scadenza) per tutti i video di cui si è proprietari. Questo può essere utile se si sta creando una pagina che incorpora una serie di video diversi e non si vuole generare token specifici per ogni video incorporato. È anche il metodo richiesto se si incorpora una playlist.
Il terzo è simile al primo, ma richiede anche di specificare il formato (video/download/sorgente), in modo da consentire solo la riproduzione ma non il download con quel token.
Gettoni specifici per i video
Per generare un token USS, si sceglie innanzitutto un tempo di scadenza per il token. In genere, si sceglie un orario di circa qualche minuto nel futuro (si noti che idealmente l’orario del sistema dovrebbe essere sincronizzato tramite NTP o un protocollo simile, in modo che il sistema pensi che sia lo stesso orario del sistema di Dacast). L’ora scelta deve essere in UTC e convertita in una stringa del formato:
YYYYMMDDHHMMSS
Così, ad esempio, il 10 luglio 2021, 07:18:22 PM (UTC) sarà espresso come:
20210710191822
Il parametro uss_token viene quindi generato come la seguente stringa:
2.<expiry_timestamp>.MD5(<content_id>:<signing_key>:<expiry_timestamp>)
dove `<scadenza_timestamp>è la stringa del timestamp generata sopra, `<contenuto_id>` è l’ID del contenuto del video che si sta incorporando e `<chiave_di_firma>` è la chiave di firma che si trova nella pagina delle impostazioni di Dacast. MD5() è una funzione che calcola l’hash MD5 di una stringa data.
Gettoni specifici per l’utente
Questo tipo di token non richiede l’id del video e sarà valido per tutti i video e le playlist. Il metodo di costruzione del token è simile a quello dei token specifici per i video. Il token finale è calcolato come:
3.<expiry_timestamp>.MD5(<signing_key>:<expiry_timestamp>)
Le differenze sono che il token è ora preceduto da “3.” e l’id del video non è più incluso nella stringa hash.
Token specifici per il formato
Simile al token specifico per i video, ma richiede di specificare uno dei formati video/download/source, a seconda di ciò che si vuole consentire:
4.<expiry_timestamp>.MD5(video:<content_id>:<signing_key>:<expiry_timestamp>)
o
4.<expiry_timestamp>.MD5(download:<content_id>:<signing_key>:<expiry_timestamp>)
Esempi di lingua
Ecco alcuni esempi di generazione di token di sicurezza firmati dall’utente in alcuni comuni linguaggi lato server:
Rubino
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#
Al momento non disponiamo di un esempio completo di codice C#, poiché non siamo ingegneri .NET. Tuttavia, il problema principale è la creazione di un hash MD5 della stringa. Qui c’è un articolo che spiega esattamente come farlo: Come calcolare un hash MD5 da una stringa?