Criptografia de arquivos

A criptografia do Vonage Video permite que você crie arquivos nos quais os dados nunca ficam armazenados em estado não criptografado.

Você pode proteger seus arquivos das seguintes maneiras:

  • Desativar o armazenamento de arquivo como alternativa — Por padrão, a Vonage armazena um arquivo de backup em seus servidores caso não consiga fazer o upload do arquivo para o servidor Amazon S3 ou Microsoft Azure especificado por você. É possível impedir esse armazenamento alternativo usando a API REST para definir o destino do upload do arquivo de backup.
  • Use a criptografia de vídeo da Vonage — Isso permite que você crie arquivos nos quais os dados nunca ficam armazenados em estado não criptografado. Isso oferece o mais alto nível de segurança.
  • Use a criptografia do lado do servidor do Amazon S3 — Essa opção utiliza chaves de criptografia gerenciadas pelo Amazon S3 para a criptografia. Para obter mais detalhes, consulte este guia para desenvolvedores.

Com a criptografia de vídeo da Vonage, os dados de vídeo e áudio em um arquivo da Vonage são criptografados por meio de um certificado de chave pública que você fornece à Vonage.

Importante: O recurso de criptografia da Vonage está disponível como um recurso adicional. Entre em contato conosco para ativar esse recurso para as chaves do seu projeto.

Visão geral dos recursos

O recurso de arquivamento criptografado da plataforma Vonage Video permite que você crie arquivos nos quais os dados nunca ficam armazenados em estado não criptografado.

Primeiro, crie um par de chaves RSA (pública e privada) para usar com seus arquivos. Por meio de uma chamada à API REST, você compartilha o certificado da chave pública com a Vonage. (Na mesma chamada REST, você envia detalhes sobre o destino de upload no Amazon S3 ou no Microsoft Azure a ser usado para seus arquivos.)

(O recurso de arquivamento criptografado exige que você defina um destino para o upload.) Você salva a chave privada localmente para o seu apenas para uso privado.

A Vonage, então, criptografa cada arquivo usando uma senha gerada aleatoriamente, criptografa-o com o certificado e armazena a senha criptografada em nossos servidores.

Quando o arquivo estiver pronto, você será notificado por meio de uma chamada de retorno ao seu servidor e poderá solicitar a senha. Em nenhum momento a Vonage armazena a senha não criptografada, e a Vonage não tem como descriptografá-la (apenas o detentor da chave privada pode descriptografá-la).

Em seguida, você pode descriptografar a senha usando a chave privada e usar essa senha para descriptografar o arquivo compactado. O arquivo compactado descriptografado está no formato MPEG-TS.

A Vonage utiliza o algoritmo AES-256 para criptografar o arquivo.

A senha gerada é criptografada usando a criptografia RSA com preenchimento OAEP. Observe que só é possível usar o arquivamento criptografado com arquivos compostos, e não com arquivos de fluxo individuais.

Neste guia, abordaremos os seguintes temas:

Criação de um certificado de arquivamento criptografado

Envio do certificado de arquivamento criptografado para a Vonage

Descompactar um arquivo

Desativando o arquivamento criptografado

Problemas conhecidos

Criação de um certificado de arquivamento criptografado

Crie um certificado X.509 no formato PEM e uma chave privada correspondente para usar com seus arquivos:

openssl req -new -x509 -days 365 -newkey rsa:2048 -out cert.pem -keyout key.pem

(Observação: Isso foi testado com o OpenSSL 1.0.1.)

Você enviará o certificado à Vonage, que o utilizará para gerar uma senha criptografada, necessária para descriptografar o arquivo compactado. A senha pode ser descriptografada com sua chave privada, e o arquivo compactado pode ser descriptografado com essa senha. A senha será diferente para cada arquivo compactado.

O tamanho da chave deve ser de 2048 bits ou menos. Você enviará o certificado em formato JSON para a Video API da Vonage para definir o destino do arquivo (consulte a próxima seção). Como o certificado será incluído nos dados JSON, envie os dados codificados em base64 ou substitua os caracteres de nova linha no certificado por "\n".

O exemplo a seguir codifica o certificado em base64:

openssl enc -base64 -in cert.pem -out cert.pem.encoded -A

Uma string de certificado codificada em base64 tem a seguinte aparência:

"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0..." 

Uma sequência de caracteres de um certificado com os caracteres de nova linha substituídos fica assim:

"-----BEGIN CERTIFICATE-----\n...\n...\n -----END CERTIFICATE-----"

Envio do certificado de arquivamento criptografado para a Vonage

Para configurar o certificado e habilitar a criptografia do arquivo, envie uma solicitação HTTP PUT para a seguinte URL:

/v2/project/archive/storage 

Substituir appId com o App ID do seu projeto.

Autentique a solicitação da API REST usando o Cabeçalho de autorização:

Authorization: Basic base64(APP_ID:API_SECRET)

Crie o token JSON da web com as seguintes reivindicações:

{
    "iss": "your_app_id",
    "ist": "project",
    "iat": current_timestamp_in_seconds,
    "exp": expire_timestamp_in_seconds,
    "jti": "jwt_nonce"
}
  • Conjunto iss ao seu ID do aplicativo Vonage Video (fornecido a você em seu Account da Vonage (na página do Projeto).
  • Conjunto ist para “projeto”.
  • Conjunto iat até o timestamp da época Unix atual (quando o token foi criado), em segundos.
  • Conjunto exp até o prazo de validade do token. Por motivos de segurança, recomendamos que você utilize um prazo de validade próximo à hora de criação do token (por exemplo, 3 minutos após a criação) e que crie um novo token para cada chamada à API REST. O intervalo máximo permitido para o prazo de validade é de 5 minutos.
  • Conjunto jti para um identificador exclusivo do JWT. Isso é opcional. Consulte o Especificação do JSON Web Token para mais detalhes.

Use a chave privada do seu projeto como chave secreta do JWT e assine-o com o algoritmo de criptografia HMAC-SHA256. (Sua chave privada é fornecida a você em seu Account da Video API na página do projeto.) Por exemplo, o código Python a seguir cria um token que pode ser usado em uma chamada à API REST:

import jwt # See https://pypi.python.org/pypi/PyJWT
import time
import uuid
print jwt.encode({"iss": "my-project-API-key",
  "iat": int(time.time()),
  "exp": int(time.time()) + 180,
  "ist": "project",
  "jti": str(uuid.uuid4())()},
  'my-project-API-secret',
  algorithm='RS256')

Substituir my-project-API-key e my-project-API-secret com o App ID e a chave secreta do projeto Vonage Video. Defina o Content-type cabeçalho para a chamada da API REST para application/json:

Content-Type:application/json

Substitua os caracteres de nova linha no certificado por "\n", para que você possa usá-la no literal de string nos dados JSON. Passe o certificado da chave pública como uma propriedade dos dados JSON que você envia ao chamar o método REST para configurar o armazenamento de arquivos. Consulte as próximas seções.

Configurando o arquivamento criptografado para um destino do Amazon S3

Para especificar um certificado de chave pública a ser usado com um destino do Amazon S3, configure os dados JSON na chamada da API REST para que sigam o seguinte formato:

{
    "type": "s3",
    "config": {
        "bucket": "example.com.archive-bucket",
        "secretKey": "BvKwyshsmEATx5mngeloHwgKrYMbP+",
        "accessKey": "AWFS7BAO536E6MXA"
    },
    "fallback": "none",
    "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0..."
}

Conjunto bucket para o nome do bucket do Amazon S3 que você deseja usar para o envio do arquivo. Defina o secretKey e accessKey propriedades da chave secreta e da chave de acesso do Amazon S3 para esse bucket.

Defina a propriedade “fallback” como "none" para impedir que os arquivos de arquivo sejam armazenados na nuvem de vídeo da Vonage caso o upload falhe. Defina a propriedade como "opentok" para que o arquivo fique disponível no seu painel, caso o envio falhe.

Defina a propriedade do certificado como o certificado de chave pública que a Vonage usará para criptografar o arquivo compactado. Certifique-se de codificar o certificado em base64 ou substituir os caracteres de nova linha no certificado por "\n", para que você possa usá-lo no literal de string nos dados JSON.

Configurando o arquivamento criptografado para um destino no Microsoft Azure

Para especificar um certificado de chave pública a ser usado com um destino do Microsoft Azure, configure os dados JSON na chamada da API REST para que sigam o seguinte formato:

{
    "type": "azure",
    "config": {
        "accountName":"myAccountname",
        "accountKey":"myAccountKey",
        "container": "containerName"
    },
    "fallback": "none",
    "certificate" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0...
}

Defina o nome do contêiner para que corresponda ao nome do seu contêiner no Microsoft Azure. Defina o accountName e accountKey propriedades que correspondam às suas credenciais de armazenamento do Microsoft Azure.

Defina o fallback propriedade para "none" para impedir que os arquivos de arquivo sejam armazenados na nuvem de vídeo da Vonage caso o upload falhe. Defina a propriedade como "opentok" para que o arquivo fique disponível no painel caso o upload falhe.

Defina o certificate propriedade do certificado de chave pública que a Vonage utilizará para criptografar o arquivo compactado. Certifique-se de codificar o certificado em base64 ou substituir os caracteres de nova linha no certificado por "\n", para que você possa usá-lo no literal de string nos dados JSON. Uma string de certificado codificada em base64 tem a seguinte aparência:

"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0..."

Respostas da API REST

  • Uma resposta com o código de status 200 indica sucesso.
  • Uma resposta com o código de status 400 indica que você incluiu dados JSON inválidos ou que não especificou o destino do upload.
  • Uma resposta com o código de status 403 indica que você inseriu um App ID ou uma chave privada inválidos do projeto.

Exemplos

O exemplo de linha de comando a seguir configura com segurança o certificado que a Vonage deve usar ao criptografar arquivos a serem enviados para um bucket do Amazon S3:

app_id=12345 data='{"type":"s3","config":{"bucket":"your-s3-bucket","secretKey":"your-s3-secret-key","accessKey":"your-s3-access-key"},"certificate" : "...your-cert..."}' curl \ -i \ -H "Content-Type: application/json" \ -X PUT -H "Authorization: Basic base64(app_id:API_secret)" -d '$data' \ https://video.api.vonage.com/v2/project/$app_id/archive/storage

Defina o valor para app_id ao ID do aplicativo do seu projeto do Vonage Video. Defina os valores para your-s3-bucket e your-s3-access-key para corresponder às suas credenciais do Amazon S3. Substitua o valor do certificado pela sequência de caracteres do certificado.

O exemplo de linha de comando a seguir configura com segurança o certificado que a Vonage deve usar ao criptografar arquivos a serem enviados para um bucket do Microsoft Azure:

app_id=12345 data='{"type":"azure","config":{"accountName":"your-azure-account-name","accountKey":"your-azure-account-key", "container":"your-azure-container"}, "certificate": "...your-cert..."}' curl \ -i \ -H "Content-Type:application/json" \ -X PUT -H "Authorization: Basic base64(app_id:API_secret)" -d "$data" \ https://video.api.vonage.com/v2/project/$app_id/archive/storage

Defina o valor para app_id ao ID do aplicativo do seu projeto do Vonage Video. Defina os valores para your-azure-account-name, your-azure-account-name, e your-azure-container para corresponder às suas credenciais do Amazon S3. Substitua o valor do certificado pela sequência de caracteres do certificado.

Descompactar um arquivo

É possível definir um callback de status de arquivamento usando o painel. Consulte “Alterações no status de arquivamento” na Guia do desenvolvedor sobre arquivamento.

Após a criação do arquivo, as solicitações POST de status do arquivo enviadas para sua URL de retorno de chamada incluem uma propriedade “password”:

{
    "id" : "b40ef09b-3811-4726-b508-e41a0f96c68f",
    "event": "archive",
    "createdAt" : 1384221380000,
    "duration" : 328,
    "name" : "Foo",
    "partnerId" : 123456,
    "reason" : "",
    "sessionId" : "2_MX40NzIwMzJ-flR1ZSBPERUIDIwMTN-MC45NDQ2MzE2NH4",
    "size" : 18023312,
    "status" : "uploaded",
    "password" : "e42c...d23"
}

A senha consiste em uma chave AES criptografada por certificado e um vetor de inicialização, na forma de dados binários codificados em base64.

Os três primeiros bytes dos dados binários representam a versão (um byte), o algoritmo (um byte) e o modo (um byte). Nesta versão, o comprimento é definido como 1, o algoritmo é definido como 1 (indicando AES-256) e o modo é definido como 1 (indicando CBC).

Os próximos 32 bytes constituem a chave. Os 16 bytes restantes constituem o vetor de inicialização.

Primeiro, decodifique a senha e, em seguida, descriptografe-a usando sua chave privada:

openssl enc -base64 -d -A <<< "password-from-tokbox" \ -out password.enc openssl rsautl -decrypt -oaep -inkey key.pem \ -in password.enc -out password.bin

Em seguida, use a senha para descriptografar o arquivo compactado:

openssl enc -d -aes-256-cbc -nopad -in your_archive_file.ts \ -out your_decrypted_file.ts \ -K $(xxd -s 3 -l 32 -c 32 -p password.bin) \ -iv $(xxd -s 35 -l 16 -c 16 -p password.bin)

-K é a chave -iv é o vetor de inicialização xxd converte a senha decodificada e descriptografada em binário para o formato hexadecimal, de modo que possa ser passada para o OpenSSL. Leia a página de manual do xxd para obter mais informações sobre as opções.

Desativando o arquivamento criptografado

Para desativar o arquivamento criptografado, envie uma solicitação HTTP PUT para a URL do armazenamento de arquivos (consulte Envio do certificado de arquivamento criptografado para a Vonage), mas defina o certificado como nulo nos dados JSON que você enviar junto com a solicitação.

Desativando o arquivamento criptografado para um destino do Amazon S3

Para remover um certificado de chave pública de um destino de arquivamento do Amazon S3 (e desativar a criptografia dos arquivos), chame a API REST com os seguintes dados JSON:

{
    "type": "s3",
    "config": {
        "bucket": "example.com.archive-bucket",
        "secretKey": "BvKwyshsmEATx5mngeloHwgKrYMbP+",
        "accessKey": "AWFS7BAO536E6MXA"
    },
    "fallback": "none",
    "certificate" : null
}

Conjunto bucket para o nome do bucket do Amazon S3 que você deseja usar para o envio do arquivo. Defina o secretKey e accessKey propriedades da chave secreta e da chave de acesso do Amazon S3 para esse bucket. Defina o fallback propriedade to "none" para impedir que os arquivos de arquivo sejam armazenados na nuvem da Vonage caso o upload falhe. Defina a propriedade como "opentok" para que o arquivo fique disponível no painel da Vonage caso o upload falhe. Defina o certificate propriedade para null.

Desativando o arquivamento criptografado para um destino do Microsoft Azure

Para remover um certificado de chave pública de um destino de arquivamento do Microsoft Azure (e remover a criptografia dos arquivos), chame a API REST com os seguintes dados JSON:

{
    "type": "azure",
    "config": {
        "accountName":"myAccountname",
        "accountKey":"myAccountKey",
        "container": "containerName"
    },
    "certificate" : null
}

Conjunto container para corresponder ao nome do seu contêiner do Microsoft Azure. Defina o accountName e accountKey propriedades que correspondam às suas credenciais de armazenamento do Microsoft Azure. Defina o fallback propriedade para "none" para impedir que os arquivos de arquivo sejam armazenados na nuvem da Vonage caso o upload falhe. Defina a propriedade como "opentok" para que o arquivo fique disponível no painel da Vonage caso o upload falhe. Defina o certificate propriedade para null.

Respostas da API REST

  • Uma resposta com o código de status 200 indica que a desativação da criptografia foi bem-sucedida.
  • Uma resposta com o código de status 400 indica que você incluiu dados JSON inválidos ou que não especificou o destino do upload.
  • Uma resposta com o código de status 403 indica que você inseriu um App ID de projeto ou um segredo de parceiro inválido.

Exemplo

O exemplo de linha de comando a seguir desativa o arquivamento criptografado para um destino S3:

app_id=12345 data='"type": "s3","config": {"bucket": "your-s3-bucket","secretKey": "your-s3-secret-key","accessKey": "your-s3-access-key"},{"certificate" : null}' curl \ -i \ -H "Content-Type:application/json" \ -X PUT -H "Authorization: Basic base64(app_id:API_secret)" -d "$data" \ https://video.api.vonage.com/v2/project/$app_id/archive/storage

Defina o valor para app_id ao seu ID do aplicativo Vonage Video. Defina os valores para your-s3-bucket e your-s3-access-key para corresponder às suas credenciais do Amazon S3.

Problemas conhecidos

A duração de um arquivo criptografado é sempre informada como 0, em todas as chamadas da API REST do Vonage Video, nos métodos dos SDKs do servidor do Vonage Video e nos callbacks de alteração de status do arquivo.