Criptografia do lado do cliente para blobs

A Biblioteca de clientes do Armazenamento de Blobs do Azure dá suporte à criptografia de dados em aplicativos cliente antes de carregar no Armazenamento do Azure, bem como à descriptografia de dados durante o download para o cliente. A biblioteca também dá suporte à integração com o Cofre da Chave do Azure para o gerenciamento de chaves de contas de armazenamento.

Importante

O Armazenamento de Blobs dá suporte à criptografia do lado do serviço e do lado do cliente. Para a maioria dos cenários, a Microsoft recomenda o uso de recursos de criptografia do lado do serviço para facilitar o uso na proteção de dados. Para saber mais sobre a criptografia do lado do serviço, confira Criptografia do Armazenamento do Azure para dados inativos.

Para obter um tutorial passo a passo que orienta você pelo processo de criptografia de blobs usando criptografia do lado do cliente e o Cofre da Chave do Azure, confira Criptografar e descriptografar blobs no Armazenamento do Microsoft Azure usando a Chave do Cofre do Azure.

Sobre a criptografia do lado do cliente

A biblioteca de clientes do Armazenamento de Blobs do Azure usa a AES (criptografia AES) para criptografar dados do usuário. Duas versões da criptografia do lado do cliente estão disponíveis na biblioteca de clientes:

Aviso

O uso da versão 1 da criptografia do lado do cliente não é mais recomendado devido a uma vulnerabilidade de segurança na implementação do modo CBC da biblioteca de clientes. Para saber mais sobre essa vulnerabilidade de segurança, confira Armazenamento do Azure atualiza a criptografia do lado do cliente no SDK para resolver a vulnerabilidade de segurança. Se você está usando a versão 1, recomendamos atualizar o aplicativo para usar a versão 2 e migrar os dados. Consulte a seção a seguir, Atenuar a vulnerabilidade de segurança em seus aplicativos, para obter mais diretrizes.

Atenuar a vulnerabilidade de segurança em seus aplicativos

Devido a uma vulnerabilidade de segurança descoberta na implementação da biblioteca de clientes do Armazenamento de Blobs no modo CBC, a Microsoft recomenda que você execute uma ou mais das seguintes ações imediatamente:

  • Considere usar recursos de criptografia do lado do serviço em vez da criptografia do lado do cliente. Para saber mais sobre os recursos de criptografia do lado do cliente, confira Criptografia do Armazenamento do Azure para dados inativos.

  • Se você precisar usar a criptografia do lado do cliente, migre seus aplicativos da criptografia do lado do cliente v1 para a criptografia do lado do cliente v2.

A seguinte tabela resume as etapas para executar se optar por migrar seus aplicativos para a criptografia do lado do cliente v2:

Status da criptografia do lado do cliente Ações recomendadas
O aplicativo está usando a criptografia do lado do cliente com uma versão da biblioteca de clientes que dá suporte apenas à criptografia do lado do cliente v1. Atualize o aplicativo para usar uma versão da biblioteca de clientes com suporte para a criptografia do lado do cliente v2. Confira a matriz de suporte do SDK para criptografia do lado do cliente para ver uma lista de versões com suporte. Saiba mais...

Atualize seu código para usar a criptografia do lado do cliente v2. Saiba mais...

Baixe todos os dados criptografados para descriptografá-los e criptografe-os novamente usando a criptografia do lado do cliente v2. Saiba mais...
O aplicativo está usando a criptografia do lado do cliente com uma versão da biblioteca de clientes com suporte para a criptografia do lado do cliente v2. Atualize seu código para usar a criptografia do lado do cliente v2. Saiba mais...

Baixe todos os dados criptografados para descriptografá-los e criptografe-os novamente usando a criptografia do lado do cliente v2. Saiba mais...

Além disso, a Microsoft recomenda que você execute as seguintes etapas para ajudar a proteger seus dados:

Matriz de suporte do SDK para criptografia do lado do cliente

A seguinte tabela mostra quais versões das bibliotecas de clientes para .NET, Java e Python dão suporte diferentes versões da criptografia do lado do cliente:

.NET Java Python
Criptografia do lado do cliente v2 e v1 Versões 12.13.0 e posteriores Versões 12.18.0 e posteriores Versões 12.13.0 e posteriores
Criptografia do lado do cliente v1 apenas Versões 12.12.0 e anteriores Versões 12.17.0 e anteriores Versões 12.12.0 e anteriores

Observação

A criptografia do lado do cliente v2.1 está disponível no SDK do Java para versões 12.27.0 e posteriores. Essa versão permite configurar o comprimento da região para criptografia autenticada, de 16 bytes a 1 GiB. Para obter mais informações, confira o exemplo de Java no Exemplo: Criptografar e descriptografar um blob com a criptografia do lado do cliente v2.

Se o aplicativo estiver usando a criptografia do lado do cliente com uma versão anterior da biblioteca de clientes .NET, Java ou Python, primeiro você precisará atualizar o código para uma versão com suporte para a criptografia do lado do cliente v2. Em seguida, você precisará descriptografar e criptografar novamente os dados com a criptografia do lado do cliente v2. Se necessário, você poderá usar uma versão da biblioteca de clientes com suporte para a criptografia do lado do cliente v2 lado a lado com uma versão anterior da biblioteca de clientes enquanto estiver migrando seu código. Para ver exemplos de código, confira Exemplo: criptografar e descriptografar um blob com a criptografia do lado do cliente v2.

Como a criptografia do lado do cliente funciona

As bibliotecas de clientes do Armazenamento de Blobs do Azure usam a criptografia de envelope para criptografar e descriptografar dados no lado do cliente. A criptografia de envelope criptografa uma chave com uma ou mais chaves adicionais.

As bibliotecas de clientes do Armazenamento de Blobs usam o Azure Key Vault para proteção das chaves usadas para criptografia do lado do cliente. Para obter mais informações sobre o Azure Key Vault, confira O que é o Azure Key Vault?.

Criptografia e descriptografia com a técnica de envelope

A criptografia com a técnica de envelope funciona da seguinte maneira:

  1. A biblioteca de clientes do Armazenamento do Azure gera uma CEK (chave de criptografia de conteúdo) que é uma chave simétrica de uso único.

  2. Os dados do usuário são criptografados usando a CEK.

  3. O CEK é empacotada (criptografada) usando o KEK (Chave de Criptografia de Chave). A KEK é identificada por um identificador de chave e pode ser um par de chaves assimétricas ou uma chave simétrica. Você pode gerenciar a KEK localmente ou armazená-la no Azure Key Vault.

    A biblioteca de clientes do Armazenamento do Azure em si nunca tem acesso à KEK. Ela simplesmente invoca o algoritmo de disposição de chave fornecido pelo Cofre da Chave. Os usuários podem escolher usar provedores personalizados para desempacotamento/quebra da chave, se desejado.

  4. Em seguida, os dados criptografados são carregados no Armazenamento de Blobs do Azure. A chave encapsulada, junto com alguns metadados de criptografia adicionais, é armazenada como metadados no blob.

A descriptografia com a técnica de envelope funciona da seguinte maneira:

  1. A biblioteca de clientes do Armazenamento do Azure presume que o usuário esteja gerenciando a KEK localmente ou em um Azure Key Vault. O usuário não precisa conhecer a chave específica que foi usada para criptografia. Em vez disso, um resolvedor de chave que resolve diferentes identificadores de chaves pode ser configurado e usado.
  2. A biblioteca de clientes baixa os dados criptografados junto com demais materiais de criptografia que são armazenados no Armazenamento do Azure.
  3. Em seguida, a CEK encapsulada é desencapsulada (descriptografada) usando a KEK. A biblioteca de clientes não tem acesso à KEK durante esse processo, mas invoca apenas o algoritmo de desencapsulamento do Azure Key Vault ou outro repositório de chaves.
  4. A biblioteca de clientes usa a CEK para descriptografar os dados de usuário criptografados.

Criptografia/descriptografia no upload/download do blob

A biblioteca de clientes do Armazenamento de Blobs dá suporte à criptografia de blobs inteiros somente no upload. Para downloads, tanto os downloads completos quanto os de intervalo têm suporte. A criptografia do lado do cliente v2 divide os dados em blocos de criptografia autenticada com buffer de 4 MiB, que só podem ser transformados por completo. Para ajustar o tamanho da parte, verifique se você está usando a versão mais recente do SDK que suporta a criptografia do lado do cliente v2.1. O comprimento da região é configurável de 16 bytes até 1 GiB.

Durante a criptografia, a biblioteca de clientes gera um IV (vetor de inicialização) aleatório de 16 bytes e uma CEK aleatória de 32 bytes e executa a criptografia de envelope dos dados do blob usando essas informações. A CEK encapsulada e alguns metadados de criptografia adicionais são armazenadas como metadados de blob com o blob criptografado.

Quando um cliente baixa um blob inteiro, a CEK encapsulada é desencapsulada e usada em conjunto com o IV para retornar os dados descriptografados para o cliente.

Baixar um intervalo arbitrário no blob criptografado envolve o ajuste do intervalo fornecido pelos usuários para obter uma pequena quantidade de dados adicionais que podem ser usados para descriptografar o intervalo solicitado com êxito.

Todos os tipos de blob (blobs de blocos, blobs de páginas e blobs de anexo) podem ser criptografados/descriptografados usando este esquema.

Aviso

Se você estiver editando ou carregando seus metadados para o blob, precisará garantir que os metadados de criptografia sejam preservado. Se você carregar novos metadados sem preservar também os metadados de criptografia, a CEK, o IV e outros metadados encapsulados serão perdidos e você não poderá recuperar o conteúdo do blob. Chamar a operação Set Blob Metadata sempre substitui todos os metadados do blob.

Durante a leitura ou gravação em um blob criptografado, use comandos de upload de blob completo, como Put Blob, e comandos de download de blob completo ou em intervalos, como Get Blob. Evite gravar em um blob criptografado usando operações de protocolo como Put Block, Put Block List, Put Page ou Append Block. Chamar essas operações em um blob criptografado pode corrompê-lo e torná-lo ilegível.

Exemplo: criptografar e descriptografar um blob com a criptografia do lado do cliente v2

O exemplo de código nesta seção mostra como usar a criptografia do lado do cliente v2 para criptografar e descriptografar um blob.

Importante

Se você tiver dados que foram criptografados usando a criptografia do lado do cliente v1, será necessário descriptografar esses dados e criptografá-los novamente com a criptografia do lado do cliente v2. Confira as diretrizes e o exemplo da biblioteca de clientes abaixo.

Para usar a criptografia do lado do cliente do código .NET, consulte a Biblioteca de clientes do Armazenamento de Blobs. Verifique se você está usando a versão 12.13.0 ou posterior. Se precisar migrar da versão 11.x para a versão 12.13.0, confira o Guia de migração.

Dois pacotes adicionais são necessários para a integração do Azure Key Vault para a criptografia do lado do cliente:

  • O pacote Azure.Core fornece as interfaces IKeyEncryptionKey e IKeyEncryptionKeyResolver. A biblioteca de clientes do Armazenamento de Blobs para .NET já define esse assembly como uma dependência.

  • O pacote Azure.Security.KeyVault.Keys (versão 4.x e posterior) fornece o cliente REST do Key Vault e os clientes criptográficos usados com a criptografia do lado do cliente. Certifique-se de que esse pacote é referenciado em seu projeto, se você estiver usando o Azure Key Vault como repositório de chaves.

    O Azure Key Vault foi criado para chaves mestras de alto valor e os limites por cofre de chaves refletem esse design. A partir da versão 4.1.0 de Azure.Security.KeyVault.Keys, a interface IKeyEncryptionKeyResolver não dá suporte ao cache de chaves. Se o cache for necessário devido à limitação, você poderá usar a abordagem demonstrada neste exemplo para injetar uma camada de cache em uma instância de Azure.Security.KeyVault.Keys.Cryptography.KeyResolver.

Os desenvolvedores podem fornecer uma chave, um resolvedor de chaves ou uma chave junto com um resolvedor de chaves. As chaves são identificadas usando um identificador de chave que fornece a lógica para encapsulamento e desencapsulamento da CEK. Um resolvedor de chave é usado para resolver uma chave durante o processo de descriptografia. Ele define um método de resolução que retorna uma chave quando é fornecido um determinado identificador de chave. O resolvedor fornece aos usuários a capacidade de escolher entre várias chaves que são gerenciadas em vários locais.

Na criptografia, a chave é sempre usada e a ausência de uma chave resulta em um erro.

Na descriptografia, se a chave for especificada e seu identificador corresponder ao identificador de chave necessário, essa chave será usada para descriptografia. Caso contrário, a biblioteca de clientes tentará chamar o resolvedor. Se não houver nenhum resolvedor especificado, a biblioteca de clientes gerará um erro. Se um resolvedor for especificado, o resolvedor de chave será invocado para obter a chave. Se o resolvedor for especificado, mas não tiver um mapeamento para o identificador de chave, um erro será gerado pela biblioteca de clientes.

Para usar a criptografia do lado do cliente, crie um objetoClientSideEncryptionOptions e defina-o na criação do cliente com SpecializedBlobClientOptions. Não é possível definir opções de criptografia por API. Todo o resto é tratado internamente pela biblioteca de clientes.

// Your key and key resolver instances, either through Azure Key Vault SDK or an external implementation.
IKeyEncryptionKey key;
IKeyEncryptionKeyResolver keyResolver;

// Create the encryption options to be used for upload and download.
ClientSideEncryptionOptions encryptionOptions = new ClientSideEncryptionOptions(ClientSideEncryptionVersion.V2_0)
{
   KeyEncryptionKey = key,
   KeyResolver = keyResolver,
   // String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
   KeyWrapAlgorithm = "some algorithm name"
};

// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

// Create blob client with client-side encryption enabled.
// Client-side encryption options are passed from service clients to container clients, 
// and from container clients to blob clients.
// Attempting to construct a BlockBlobClient, PageBlobClient, or AppendBlobClient from a BlobContainerClient
// with client-side encryption options present will throw, as this functionality is only supported with BlobClient.
BlobClient blob = new BlobServiceClient
(new Uri($"https://{accountName}.blob.core.windows.net"), new DefaultAzureCredential(), options).GetBlobContainerClient("my-container").GetBlobClient("myBlob");

// Upload the encrypted contents to the blob.
blob.Upload(stream);

// Download and decrypt the encrypted contents from the blob.
MemoryStream outputStream = new MemoryStream();
blob.DownloadTo(outputStream);

Você pode aplicar opções de criptografia a construtores BlobServiceClient, BlobContainerClient ou BlobClient que aceitam objetos BlobClientOptions.

Se um objeto BlobClient já existir no código, mas sem opções de criptografia do lado do cliente, você poderá usar um método de extensão para criar uma cópia desse objeto com o ClientSideEncryptionOptionsdeterminado. Esse método de extensão evita a sobrecarga de construir um novo objeto BlobClient do zero.

using Azure.Storage.Blobs.Specialized;

// An existing BlobClient instance and encryption options.
BlobClient plaintextBlob;
ClientSideEncryptionOptions encryptionOptions;

// Get a copy of the blob that uses client-side encryption.
BlobClient clientSideEncryptionBlob = plaintextBlob.WithClientSideEncryptionOptions(encryptionOptions);

Depois de atualizar o código para usar a criptografia do lado do cliente v2, descriptografe e criptografe novamente todos os dados criptografados existentes, conforme descrito em Criptografar novamente dados já criptografados com a criptografia do lado do cliente v2.

Criptografar novamente dados já criptografados com criptografia do lado do cliente v2

Todos os dados criptografados anteriormente com a criptografia do lado do cliente v1 devem ser descriptografados e, em seguida, criptografados novamente com a criptografia do lado do cliente v2 para atenuar a vulnerabilidade de segurança. Descriptografar exige o download dos dados e criptografar novamente exige recarregar os dados no Armazenamento de Blobs.

Para ver um exemplo de projeto que mostra como migrar dados da criptografia do lado do cliente v1 para a v2 e como criptografar dados com a criptografia do lado do cliente v2 no .NET, consulte o Exemplo de projeto de migração de criptografia.

Criptografia do lado do cliente e desempenho

Tenha em mente que criptografar seu armazenamento de dados resulta em uma sobrecarga adicional no desempenho. Quando você usa a criptografia do lado do cliente em seu aplicativo, a biblioteca de clientes deve gerar com segurança a CEK e o IV, criptografar o conteúdo em si, comunicar-se com o repositório de chaves escolhido para o envelopamento de chaves e formatar e carregar metadados adicionais. Essa sobrecarga varia dependendo da quantidade de dados que está sendo criptografada. Recomendamos que os clientes sempre testem seus aplicativos a fim de verificar o desempenho durante o desenvolvimento.

Próximas etapas